简介: TLS/SSL 握手失败引起的连接异常问题怎么搞?阿里云 SRE 工程师手把手带你排查解决。

1.TLS/SSL 握手基本流程


*图片来源于网络

2.案例分享

2.1CFCA 证书的历史问题

2.1.1背景

某客户为其生产环境的站点申请了一张由 CFCA 签发的证书。相关域名正确配置该证书且启用 HTTPS 后,经测试发现他们的客户端 App 在低版本手机上( iOS < 10.0,Android < 6.0)无法连接到相关站点。

客户端调试发现,控制台会看到证书无效的错误信息(Invalid Certificate 或 Certificate Unknown )。

2.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

2.1.3小结

从上面的分析可以看到,该问题的根因是低版本客户端设备没有内置 CFCA 的 CA 根证书。因此,基本的解决方案包括:

  1. 更换其他 CA 机构签发的证书,保证其 CA 根证书的在特定设备上已默认信任。
  2. 手动在受影响的设备上安装该 CA 根证书及中间证书,并配置为信任状态。
  3. 客户端 App 预置该 CA 根证书,并通过客户端代码配置信任该证书。

需要结合不同的业务场景选择合理解决方案。

2.2证书链信任模式引起的问题

2.2.1背景

某客户新增了一个容灾备用接入地址,启用了一个新的域名并配置了一张全新的证书。测试发现,切换到该备用地址时,Android 客户端无法正常连接,报证书未知错误(Certificate Unknown);iOS 客户端表现正常。

2.2.2排查

和 2.1 的问题类似,首先在受影响的设备上进行问题复现及客户端抓包操作。

获取到网络包之后,确认了客户端连接失败的直接原因为 TLS 握手过程异常终止,原因与 2.1 中的问题一样,为Certificate Unknown :

类似问题 2.1 的排查动作,查看该证书的 CA 根证书及根证书的信任情况。

发现该证书由中间 CA 机构 Secure Site Pro CA G2 签发,其根 CA 为 DigiCert Global Root CA:

DigiCert Global Root CA 作为一个广泛支持的证书签发机构,其根 CA 证书在绝大多数的设备上均为受信任状态,这一点在受影响的设备上也得到了确认。既然根 CA 的证书处于信任状态,为何证书验证还是失败?这成为下一步排查的重点方向。

同一台设备,切换到正常环境下,也完成一次抓包操作。获取到新的网络包后做对比分析,发现两种情况下网络包中体现的区别为:

正常环境下,服务器返回的证书包含了完整的 CA 证书链;

异常情况下,服务端返回的证书仅包含叶节点 CA 证书。

根据上述线索进行排查研究,发现:不同于其他平台,Android 客户端默认是不会通过 AIA Extension 去做证书链的校验。

*参考:https://tools.ietf.org/html/rfc3280#section-4.2.2.1 ;https://developer.android.com/training/articles/security-ssl#UnknownCa

因此,当中间 CA 证书未安装或未缓存时,客户端 App 是不会主动拉取中间 CA 证书并做进一步信任链校验的,从而导致证书校验失败。

2.2.3小结

从上面的排查分析看到,该问题和 Android 平台自身的证书校验机制和证书打包方式相关。解决方案包括:

代码层面手动定制 TrustManager 去定制校验过程;

或重新打包证书,将中间 CA 证书和根 CA 证书一同打包到服务端证书中。

该客户综合开发成本与环境现状,选择重新打包证书。新的证书配置完成后,问题得到解决。

2.3加密套件协商引起的问题

2.3.1背景

某客户反馈他们的 iOS 客户端 App 用户在特定运营商网络环境下无法打开特定的业务站点(HTTPS 站点)。客户端处于白屏等待状态并最终报错;而在同样的网络环境下,系统浏览器可以打开该站点;同一台设备,切换到另一个网络运营商下,也可以访问该站点。

2.3.2排查

由于该问题直接表现在 Web 层,因此首先尝试通过 Charles 抓取 HTTP 层包进行分析。HTTP 日志发现相关 HTTP 请求并未发出。

由此怀疑问题发生在 TCP 层,进而在受影响的设备上进行问题复现及客户端抓包操作。

获取到网络包后,首先确认问题:

  1. 通过页面域名在网络包中寻找 DNS 解析结果;
  2. 根据 DNS 解析结果找到站点 IP,并过滤出客户端与该 IP 之间的访问情况;
  3. 观察客户端与该服务器之间的网络活动,发现存在 TLS 握手失败的情况:

从上面的网络包可以看到,服务端(机房 P 中的服务器提供接入服务)在收到 Client Hello 后,直接返回了 Handshake Failure,这种情况下,一般需要服务端配合排查握手失败的直接原因。在客户端条件下,可以进一步缩小排查疑点。

重新考虑客户问题条件:相同的网络条件下,系统浏览器可以打开该页面;同一设备切换到另一运营商下(站点此时由机房 Q 中的服务器提供接入服务),可以正常访问。针对这这两种正常情况进行抓包和进一步分析。

通过对三种情况的网络观察发现:

  1. 问题 App 发出的 Client Hello 显示支持 17 种加密套件:

  1. 正常 App 发出的 Client Hello 显示支持 26 种加密套件:

  1. 正常 App 和机房 P 服务器协商的加密套件为:TLS_RAS_WITH_3DES_EDE_CBC_SHA (0x000a) (不在问题 App 支持的加密套件范围内);
  2. 问题 App 和机房 Q 服务器协商的加密套件为:TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)(在问题 App 支持的加密套件范围内);

根据上述情况,可以推论问题的基本情况为:

  1. 问题 App 发出去的握手请求,支持17种加密套件( A 集合);
  2. 正常 App 发出去的握手请求,支持26种加密套件( B 集合);
  3. 机房 P 的接入服务器,能支持 B 集合中的至少一种加密套件,不支持 A 集合中的所有加密套件;
  4. 机房 Q 的接入服务器,既支持 A 集合中的至少一种加密套件,也支持 B 集合中的至少一种加密套件;

最终导致 问题 App 无法通过 机房 P 中的服务器 访问该站点。

2.3.3 小结

从上面的分析结论可以看到,由于客户端和服务端加密套件不匹配,导致在特定情况下的握手失败。进一步的问题解决方案包括:

调整客户端加密套件,增加支持的 Cipher Suites(涉及客户端底层 TLS/SSL 库的升级);

调整服务端加密套件,增加支持的 Cipher Suites(涉及服务端 TLS/SSL 接入配置)。

该客户最终选择调整服务端加密套件,问题得到解决。

3.总结

从上述案例的分享和实践中可以看到,TLS 层面的问题在客户端的症状表现上有相似之处,但是问题的根因却大相径庭。这里例举的问题虽不能覆盖所有的问题场景,但可以看到基本的排查思路如下:

判断问题是否属于 TLS/SSL 层面的问题。

抓取网络包;有条件的情况下,可以针对正常和异常情况抓取两份网络包,以便后续进行对比分析。

根据网络包探寻问题发生的直接原因,进而进一步探究问题的根本原因。

根据分析结论并结合业务场景,选择合适的解决方案。

这类问题的排查基础是对 HTTPS 和 TLS/SSL 协议的理解以及对分析工具的掌握。在移动领域,这类问题存在一定的共性,直接了解上述结论和分析方法可以帮助开发者快速“出坑”。

参考

  • 如何抓取网络包,https://help.aliyun.com/document_detail/159169.html
  • Security with HTTPS and SSL,https://developer.android.com/training/articles/security-ssl
  • Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile,https://tools.ietf.org/html/rfc5280

彩(广)蛋(告)

针对市面上移动应用普遍存在的破解、篡改、盗版、钓⻥欺诈、内存调试、数据窃取等各类安全风险,mPaaS 「移动安全加固」依赖于阿里云集团的移动安全加固技术,经历了淘系等亿级应用的安全性考验。

能够有效为移动应用提供稳定、简单、有效的安全保护,提高 App 的整体安全水平,力保应用不被逆向破解,在安全性上具有非常可靠的保障。

原文链接
本文为阿里云原创内容,未经允许不得转载。

搞定客户端证书错误,看这篇就够了相关推荐

  1. 搞定计算机网络面试,看这篇就够了

    目录 一 OSI与TCP/IP各层的结构与功能,都有哪些协议 1 应用层 2 运输层 3 网络层 4 数据链路层 5 物理层 二 TCP三次握手和四次挥手(面试常客) 为什么要三次握手 为什么要传回s ...

  2. 搞定操作系统面试,看这篇就够了(二)

    三.死锁 必要条件 image 互斥:每个资源要么已经分配给了一个进程,要么就是可用的. 占有和等待:已经得到了某个资源的进程可以再请求新的资源. 不可抢占:已经分配给一个进程的资源不能强制性地被抢占 ...

  3. 信息化项目投标不知道准备哪些证书?看这篇就够了!

    具备含金量的证书是企业生存和运作的前提,更是对企业能力能力的肯定.今天我们一起来看下哪些资质证书是互联网企业常备的: ISO体系类 ISO 9001 质量管理体系认证 ISO 27001 信息安全管理 ...

  4. 想要搞懂数据可视化,看这篇就够了!

    最近很多朋友跟我抱怨:为了公司数据好看,老板一个劲地想要数据可视化,以为可视化就是画画图表这么简单,可苦了自己天天加班做数据,但其实老板根本不懂可视化! 确实,数据可视化无疑是当今最火热的词,不管是做 ...

  5. 【PCB干货】是开窗还是盖油?想搞懂过孔工艺,看这篇就够了!

    过孔,即在覆铜板上钻出所需要的孔,它承接着层与层之间的导通,用于电气连接和固定器件.过孔是PCB生产至关重要且不可缺少的一环. 在PCB生产中,常见的过孔工艺有:过孔盖油.过孔塞油.过孔开窗.树脂塞孔 ...

  6. 一下子搞懂JDBC,看这篇就够了--以MySQL为例。

    一下子搞懂JDBC,看这篇就够了–以MySQL为例. 文章目录 一下子搞懂JDBC,看这篇就够了--以MySQL为例. 一.什么是JDBC? 二.JDBC的使用步骤 三.jdbc进阶--上述各个类或接 ...

  7. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  8. [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  9. [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)

    [个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...

最新文章

  1. Cordova入门系列(三)Cordova插件调用
  2. 脉脉成为互联网大厂公敌
  3. Java中测长函数_Core Java测试题
  4. VTK:网格之InterpolateFieldDataDemo
  5. live555 接收rtsp视频流流程分析
  6. 组装电脑配置单报价_组装电脑配置单推荐,性价比高的游戏、画图和办公全能配置电脑!...
  7. java 值栈的结构_Struts2 | 深入浅出理解struts2中的值栈
  8. 使用LINQ计算基本统计
  9. php数组的奇数_PHP - 查找数组元素是奇数还是偶数
  10. 马斯克公布猴子成功用“意念”打游戏,脑机接口技术距离人类还有多远?
  11. 13个坏习惯让IT工作者中过劳(转)
  12. Android中Bitmap、Drawable、byte[]转换
  13. mysql密码置空_MySQL 8.*版本 修改root密码,置空密码等
  14. 几个常用的后台管理系统
  15. FLINK提交任务的两种方式
  16. GMF:OCL(Object Constraint Language)介绍
  17. vue+spring boot项目实现PC端微信登录
  18. 从写简历,到面试、谈薪酬的那些技巧和防坑指南
  19. 升级云服务器的python3,导致宝塔面板打不开
  20. 经纬度转换成屏幕坐标

热门文章

  1. python电脑编程求圆的面积案例_学Python划重点七 网络编程(UPD Socket编程、上传文件实例、计算圆的面积实例)...
  2. java 调用 mahout_java – 运行Mahout本地获取MahoutDriver的ClassNotFoundException
  3. 可以结束一个循环的关键字是python_第33 p,for遍历,循环取值最方便
  4. python 如何边改代码边调试_Python 代码调试神器:PySnooper
  5. php object keys_原生js中Object.keys方法详解
  6. linux读整个文件内容,Linux查看整个文件
  7. python文本分词_【Python】使用jieba对文本进行分词
  8. c语言 多文件 学生系统,编的学生成绩管理系统 从文件中读取保存数据总会多读入一组乱码数据...
  9. kdj指标主要看哪个值_悟空CRM:在线crm主要看这两个指标,都非常重要!
  10. ctf的php,CTF中常见的PHP漏洞