开发者手机VPN RSA协议连接失败分析与解决方案
问题背景:
VPN功能已在7885手机3.0上进行了适配,三种认证协议(PSK、MSCHAPv2、RSA)手动推送CA证书、用户证书及私钥至默认证书存放目录(/data/service/el1/public/vpn/),三种协议均可正常连接服务器,可以ping通内网。但使用setting中安全选项去安装CA证书与用户证书(CA证书与用户证书均已正常安装成功),则出现RSA协议连不上服务器现象。此时若推送私钥至默认证书存放目录,重新启动vpn服务,能够连接服务器成功且能ping内网。若删除默认证书存放目录中的私钥,重启服务器进行连接,同样可以正常连接服务器。
问题现象&描述:
问题现象:
-
在setting中选择vpn的RSA协议,使用安全选项中系统安装的CA证书与用户证书去连接vpn服务器,连接失败。
-
手动推送私钥至默认证书存放目录,再次重启vpn服务连接服务器,成功连接。
-
删除之前手动推送至默认证书存放目录的私钥,再次重启vpn服务器。
测试方法:
1.安装CA证书:设置--->安全--->从存储设备安装--->CA证书--->选择我们推送证书的Download文件夹--->点击strongswanCert.pem文件(CA证书)进行安装。
2.安装用户证书与私钥:设置--->安全--->从存储设备安装--->系统凭证--->选择我们推送证书的Download文件夹--->点击carolCert.p12文件输入密码进行安装。P12格式文件中打包了用户证书与私钥。
3.添加vpn RSA配置:设置--->更多连接--->vpn--->添加vpn网络--->设置配置/选择RSA协议/输入服务器ip地址/输入ipsec标识符/选择安装的CA证书/选择选择安装的用户证书--->保存。
4.点击刚配置的vpn设置进行连接。结果显示:连接失败。
5.手动推送私钥至默认证书存放目录:
hdc file send C:\carolKey.pem /data/service/el1/public/vpn/
6.点击刚配置的vpn设置进行连接。结果显示:连接成功。
7.删除之前手动推送至默认证书存放目录的私钥:
rm /data/service/el1/public/vpn/carolKey.pem
8.点击刚配置的vpn设置进行连接。结果显示:连接成功。
定位过程&根因分析:
从日志中可以得知是因为IKE_AUTH验证阶段,服务端返回的验证结果为AUTHENTICATION_FAILED,随后SA连接状态由CREATED改变为DESTROYING,导致连接失败。
所以从此处往上寻找验证失败的原因。
日志显示是在身份验证过程中没有找到用户证书对应的私钥导致的错误。
通过此日志知道私钥原因导致的,为了确认这个问题,随机我们将私钥文件carolKey.pem手动推送进了证书默认存放目录中,重启vpn服务连接服务器,发现能够正常连接服务器。
查看hilog日志也能确定读取证书信息并没有失败。
通过此次验证,能够确定问题根因出现在私钥上。那么现在就得思考,安装用户证书时私钥是否进行了正确安装。
证书安装时由certificate_manager模块进行的,最终会将CA证书、用户证书与私钥信息存放到数据库中。所以我们去查找数据库文件进行查验。通过寻找与验证,发现证书数据库文件存放在/data/service/el1/public/cert_manager_service文件中。我们将此文件拷贝出来进行查看。
通过对cert_manager_service文件的分析,发现本该存储私钥的priv_credential目录中没有任何内容与文件,这显然是不合理的,所以需要找到私钥未加载到此目录中的原因。
通过查阅certificate_manager文档,发现openharmony在安装证书时,私钥并不会存放到数据库,而是有一个HUKS库(华为通用秘钥库系统),证书会存放到HUSK库中进行管理。通过查看HUSK模块目录,发现私钥加密存储在/data/service/el1/public/huks_service/maindata/0/3515/key路径中。但是HUSK库不提供接口让你获取私钥文件或者内容,只能通过HUSK库提供的接口使用进行验签。
从代码中可以看到,首先会从我们默认的路径中去读取私钥,若读取到则会拿私钥去进行验证连接,若未在默认路径中读取到私钥则会调用HUSK提供的接口去进行验签。这也是为什么我们将私钥文件推送至默认路劲vpn连接成功的原因。
但日志中显示验签是成功的。抓取了连接成功与失败的通信数据,发现失败的数据中显然少发送了一些数据包,所以在发出请求后服务端验证未通过没有进行响应。
通过仔细研读ipsec协议文档,发现使用RSA协议进行身份验证过程中,发送的报文会有一个Cert。
而这个cert没有加载进message,该message发送给服务器,校验不通过。
通过查看日志也能验证此种情况,为什么拿不到CERT,因为默认vpn配置目录中没有存放Key(carolKey.pem),所以走了证书管理提供的证书验签接口,只能得到auth数据,没有接口获得cert信息的接口,无法把cert payload进message。所以我们只能通过将carolKey.pem手动放置默认路径才能连接成功。而在默认路径放置了私钥后,会生成cert然后与服务器进行身份验证,验证成功后会建立SA隧道,随后的vpn通信会通过此隧道进行,而在ipsec协议中,通过IKE协商建立的SA具有生存周期,可以实时更新,降低了SA被破解的风险,提高了安全性。生存周期到达指定的时间或指定的流量,SA就会失效。在SA快要失效前,IKE将为对等体协商新的SA。在新的SA协商好之后,对等体立即采用新的SA保护通信。所以才会导致我们在vpn连接成功后,将私钥删除重新启动vpn服务还能连接上服务器的情况。因为在上一次连接成功后SA隧道会保持一段时间,这段时间里连接VPN不会再次进行身份验证所以也就不需要私钥文件了。但是这个时间点过去后,VPN需要重新进行身份验证建立SA,在删除了私钥的情况下,会再次出现连接失败的情况。
解决方案:
解决方案1:
手动推送(carolKey.pem)到vpn配置目录或者默认内置到vpn目录
hdc file send C:\carolKey.pem /data/service/el1/public/vpn/
影响:
-
vpn的rsa协议可以正常连接vpn服务器,功能正常;
-
用户体验:证书安装不够灵活。
解决方案2:
settings中补充安装用户key的按钮。
UX实现:
在“设置--->安全--->证书与凭据--->从存储设备安装”界面下添加一个“用户Key”按钮。
点击“用户Key”按钮弹出filepicker,选择需要添加的用户Key并点击确定。
内部实现:
原理:将/storage/cloud/100/file/Docs/Download/目录下的用户Key拷贝到/data/service/el1/public/vpn/目录下,然后删除Download下的用户Key。
涉及到的fileio接口:fileip.access fileio.copyFileSync fileio.unlink
Fileio api参考链接:https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/reference/apis-core-file-kit/js-apis-fileio.md#fileiohash-2
影响:
-
vpn的rsa协议可以正常连接vpn服务器,功能正常。
-
Vpn证书的安装操作复杂度提高,但相对方案一可以灵活更换用户Key。
-
用户Key被安装在了vpn系统服务沙箱中。
注意:
目前7885开发者手机5.0.3版本,因为底座问题,证书安装界面不能弹出Download文件夹,也就点击不了Download文件夹中的CA证书与用户证书进行安装。所以在7885开发者手机5.0.3版本vpn功能暂时也只能使用以上两种备用方案。关于证书安装问题,正在组织专家定位解决,在master版本此问题已解。
更多推荐
所有评论(0)