在调试网络问题时, 抓到 HTTPS 请求并看清楚请求/响应的明文内容 是最直接的办法。因为 HTTPS 在传输层使用 TLS 加密,抓包流程比 HTTP 多了“让客户端信任代理/或绕过加密”的步骤。本文以工程实战为主线,给出一套可重复的流程:如何捕获 HTTPS 请求、如何解密并分析、常见失败原因与对应解决办法,以及在 iOS 真机和高安全场景下的可行替代方案。
先回答这些问题再选工具与流程。
准备代理抓包工具
典型工具:Charles、Fiddler、Proxyman、mitmproxy。选择一个并启动代理监听(例如本机 8888)。
让目标设备/进程走代理
安装并信任代理根证书(HTTPS 解密必需)
开启代理的 HTTPS 解密功能(SSL Proxying)
在工具中添加你要解密的域名(或通配),触发请求并观察是否能看到明文。
验证与重放
用浏览器或 curl 验证:
1curl -v -x http://<proxy_ip>:<port> https://api.example.com/
若需要修改/重放请求,代理工具多数提供编辑与重发功能,便于验证修复点。
只能看到 CONNECT / 无明文
→ 很可能证书未安装或未信任,或代理未启用解密。先在浏览器用
chls.pro/ssl(或工具指示的地址)安装证书并信任。
浏览器能抓到但 App 不能
→ 极大概率是 App 做了
SSL Pinning 或应用内使用了客户端证书(mTLS)。此时普通代理解密无效。
网络环境干扰
→ 公司网络、透明代理或 VPN 可能在中间修改流量。尝试连接手机热点或另一网络复现。
端口、SNI 或非标准 TLS
→ 服务器可能使用非 443 端口或基于 SNI 返回不同证书。用 openssl 检查:
1openssl s_client -connect api.example.com:443 -servername api.example.com
底层包能否到达代理
→ 用 tcpdump 在抓包机或路由处监听端口,确认包是否到达:
1tcpdump -i any host <device_ip> and port <proxy_port> -w /tmp/proxy.pcap
当需要在回归或 CI 中注入错误、批量 mock 接口、或统计请求时,使用 mitmproxy 写 Python 插件最灵活。mitmproxy 可在请求/响应到达时修改内容并记录。
若无法解密 TLS,但需要定位握手问题或丢包,用 tcpdump 导出 pcap,在 Wireshark 中查看 ClientHello、ServerHello、TLS Alert、重传等信息,能够判断是证书链问题、协议不兼容,还是网络丢包导致的超时。
场景 A:App 请求返回 401,但服务端日志没有任何记录
排查要点:确认请求是否真的到达服务端(tcpdump/代理日志);若未到达,查看设备 DNS 是否被劫持或请求被本地 SDK 拦截;若到达但认证失败,检查 header(Authorization)、时间差(签名过期)等。
场景 B:部分用户报告超时,抓包显示 TLS 握手未完成
排查要点:用 Wireshark 检查是否存在大量重传、SYN 无响应或 TLS Alert;若网络丢包问题,定位到具体链路并与运维同步;若握手失败且有 OCSP/CRL 请求失败,检查外网访问能力。
HTTPS 请求抓包在大多数开发和测试场景下是可以做到的:基本路径是用代理 + 安装并信任 CA;遇到自动化需求用 mitmproxy;遇到底层或网络问题用 tcpdump/Wireshark。对于 iOS 真机和高安全场景(SSL Pinning、mTLS),若无法修改 App 或替换证书,将 USB 直连抓包工具(如抓包大师 Sniffmaster)纳入工具链,能够显著提升排查效率并减少误判。把以上方法按“从易到难”的顺序执行,绝大多数 HTTPS 抓包与问题定位能被工程化地解决。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70046796/viewspace-3096382/ ,如需转载,请注明出处,否则将追究法律责任。