实例2:协议问题 - HTTPS证书链不完整

一、小白测试工程师视角
👉接收与复现:得知“部分Android机支付网络错误”,找到一台问题复现的Android测试机。

👉初步排查:检查测试机网络连接(Wi-Fi/4G)正常,尝试其他APP网络正常,排除用户环境问题。

👉抓包准备:在电脑上设置好Charles,并在Android手机上安装并信任Charles的SSL证书,配置代理。此过程可能遇到证书安装问题需要搜索解决。

👉执行抓包:在手机上操作支付流程,在Charles中看到大量请求。

👉发现异常:观察到支付域名的请求显示为红色失败标识(如SSL Handshake Failed),或者根本没有出现该请求。

👉寻求帮助/深入查看:尝试点击失败请求,查看Error或Notes信息,可能看到“证书链不完整”、“Unknown CA”等描述但不完全理解。

👉在资深同事指导下,或通过搜索,学会查看证书详情。在Charles中右键请求 -> SSL Proxying -> View Certificate,查看证书层次。

👉识别差异:对比iOS成功抓包的证书链(通常显示完整的根证书->中间证书->叶子证书),发现Android抓包中,服务器返回的证书只有叶子证书,没有中间证书。

👉报告结论:将Android和iOS的证书链截图对比,提交给运维团队,指出“服务器返回的证书链不完整,导致部分Android设备握手失败”。

二、资深测试工程师视角
👉模式识别:听到“部分机型”、“特定操作(支付)”、“网络错误”,且iOS正常,立刻高度怀疑是 “TLS/SSL兼容性问题” 或 “证书问题”。低版本Android对TLS协议和证书校验更严格是常见知识。

👉快速验证假设:
1、首先,不依赖抓包工具,可能直接在问题Android设备上使用命令行工具(如adb shell后使用curl -v https://pay.xxx.com)查看详细的TLS握手输出,快速确认2、是否在证书验证阶段失败?或在浏览器中访问支付页面,查看安全锁标识的证书信息。

针对性抓包与分析:
👉抓包时,直接过滤目标支付域名。
👉不是看HTTP请求,而是直接看TCP连接和TLS握手过程。在Wireshark中(资深测试更常用),会直接使用ssl.handshake过滤器,分析Client Hello、Server Hello、Certificate报文。
👉在Certificate报文中,直接数服务器发送的证书数量。发现只发送了一个证书(叶子证书),而非一个证书链。

根因定位:
👉立即明白:服务器配置(如Nginx/Apache的SSL配置)中,没有将中间证书文件与服务器证书文件正确合并(ssl_certificate指令应包含完整链)。
👉能推断出影响范围:依赖于系统信任存储且自动下载中间证书的iOS/高版本Android可能正常,而部分旧Android系统无法自动补全,导致校验失败。

提供完整证据链:
👉向运维提供:Wireshark抓包文件、关键握手报文截图、openssl s_client -connect pay.xxx.com:443 -showcerts命令的输出(此命令能清晰展示服务器发送的证书链)。
👉明确给出修复建议:“请检查并更新服务器nginx.conf中ssl_certificate指定的文件,确保其中包含服务器证书和中间证书(按顺序),重启服务后验证。”

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐