1.1背景
某客户为其生产环境的站点申请了一张由 CFCA 签发的证书。相关域名正确配置该证书且启用 HTTPS 后,经测试发现他们的客户端 App 在低版本手机上( iOS < 10.0,Android < 6.0)无法连接到相关站点。
客户端调试发现,控制台会看到证书无效的错误信息(Invalid Certificate 或 Certificate Unknown )。
1.2排查
起初,工程师并不知道客户的证书是由哪个机构签发以及有什么问题。而对于这类问题,一般均需要客户端网络包做进一步的分析与判断。因此安排客户在受影响的设备上进行问题复现及客户端抓包操作。
获取到网络包后,首先确认了客户端连接失败的直接原因为 TLS 握手过程异常终止,见下:
查看 Encrypted Alert 内容,错误信息为 0x02 0x2E。根据 TLS 1.2 协议(RFC5246 )的定义, 该错误为因为 certificate_unknown。
继续查看该证书的具体信息,根据 Server Hello 帧中携带的证书信息得知该证书由证书机构 China Financial Certification Authority(CFCA) 签发。再根据证书信息中的 Authority Information Access (AIA) 信息确认 Intermediate CA 和 Root CA 证书。确认该证书签发机构的根证书为 CFCA EV ROOT。
回到存在问题的手机设备上(Android 5.1),检查系统内置的受信任 CA 根证书列表,未能找到 CFCA EV ROOT CA 证书;而在正常连接的手机上,可以找到该 CA 的根证书并默认设置为”信任“。
查阅 CFCA 证书的相关说明,该机构的证书在 iOS 10.1 及 Android 6.0 及以上版本才完成入根接入。
*参考:https://www.cfca.com.cn/upload/20161101.pdf
1.3小结
从上面的分析可以看到,该问题的根因是低版本客户端设备没有内置 CFCA 的 CA 根证书。因此,基本的解决方案包括:
- 更换其他 CA 机构签发的证书,保证其 CA 根证书的在特定设备上已默认信任。
- 手动在受影响的设备上安装该 CA 根证书及中间证书,并配置为信任状态。
- 客户端 App 预置该 CA 根证书,并通过客户端代码配置信任该证书。
需要结合不同的业务场景选择合理解决方案。