Fiddler抓包实战:调试HTTPS与接口性能分析技巧
又踩坑了,Fiddler 抓不到 HTTPS 请求
上周调一个混合开发的 App,前端用的是 Vue,后端接口走的是 HTTPS。我习惯用 Fiddler 抓包看请求参数和响应数据,结果这次死活看不到任何 HTTPS 流量,HTTP 的倒是正常。一开始我还以为是手机没配好代理,折腾了半天才发现是证书问题。
试了一堆方法,全是白忙活
我先是确认手机 Wi-Fi 代理确实指向了我电脑的 IP 和 Fiddler 默认的 8888 端口,没问题。然后打开手机浏览器访问 http://ipv4.fiddler:8888,顺利下载了 FiddlerRoot.cer 证书,也手动在 Android 设置里安装了(iOS 更麻烦点,但也能装)。可一打开 App,Fiddler 依然一片空白,连个 CONNECT 都没出现。
这时候我开始怀疑是不是系统防火墙拦了,关了 Windows Defender 防火墙重试,没用。又去 Fiddler 的 Tools → Options → Connections 里确认了 “Allow remote computers to connect” 勾上了,还是不行。甚至我还重启了 Fiddler、手机、电脑三件套,照样抓不到。
最离谱的是,我用 Postman 走同一个代理,HTTPS 请求能正常抓到!说明 Fiddler 本身配置没问题,问题出在 App 上。这时候我才意识到:这 App 可能做了 SSL Pinning(证书绑定)。
原来 App 自己绑了证书
查了下项目代码,果然!团队为了安全,在 Android 和 iOS 原生层都加了 SSL Pinning。简单说就是 App 只认后端服务器的特定证书或公钥,其他中间人证书(比如 Fiddler 生成的)一律不认,直接断开连接。所以 Fiddler 根本没机会解密流量,自然抓不到内容。
这时候有两个选择:要么临时关掉 SSL Pinning(开发阶段可行),要么让 Fiddler 的证书被 App 接受。前者简单粗暴但需要改原生代码,后者更通用但配置稍复杂。我选了后者,因为不想每次调试都去动原生层。
核心操作:把 Fiddler 证书塞进信任链
关键点来了:光在系统设置里安装 Fiddler 证书还不够,因为很多 App(尤其是用 OkHttp 或 NSURLSession 的)默认只信任系统预置的 CA,不信任用户手动安装的证书。所以我们得让 App 主动信任 Fiddler 的根证书。
对于 Android,我们可以在 App 的 network_security_config.xml 里显式允许用户证书:
<network-security-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">jztheme.com</domain>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</domain-config>
然后在 AndroidManifest.xml 的 application 标签下加上:
android:networkSecurityConfig="@xml/network_security_config"
这样 App 就会信任用户安装的证书了,包括 Fiddler 的。
iOS 更麻烦一点,得在 App 的 Info.plist 里加 NSAppTransportSecurity 配置,允许任意加载(仅限调试):
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
不过这只是第一步。即使这样,有些 App 还是会校验证书指纹。所以最保险的做法是:在开发构建时,动态跳过 SSL Pinning。比如 Android 用 OkHttp 的话,可以这样写:
// 仅 Debug 模式关闭证书校验
if (BuildConfig.DEBUG) {
client = new OkHttpClient.Builder()
.sslSocketFactory(createInsecureSslSocketFactory(), (X509TrustManager) UNTRUSTED_TRUST_MANAGER)
.hostnameVerifier((hostname, session) -> true)
.build();
} else {
client = new OkHttpClient.Builder().build(); // 正式版正常校验
}
其中 createInsecureSslSocketFactory() 是自定义一个不校验证书的工厂。虽然不安全,但本地调试够用了。
别忘了 Fiddler 自己的设置
前面搞 App 端,Fiddler 这边也得配对。打开 Fiddler → Tools → Options → HTTPS,确保这几项勾上:
- Capture HTTPS CONNECTs
- Decrypt HTTPS traffic
- Ignore server certificate errors (unsafe)
特别是最后一项,不然遇到证书错误 Fiddler 直接断开。另外,第一次解密 HTTPS 时,Fiddler 会弹窗问是否信任自己的根证书,记得点 “Yes”。有时候这个弹窗会被其他窗口挡住,导致你以为没反应,其实卡在这儿了。
还有个小细节:如果你的接口域名是 jztheme.com,确保手机 DNS 能正确解析。我有一次抓不到是因为 hosts 文件里配错了 IP,Fiddler 收到的是无效请求,直接忽略了。
最终效果:终于看到请求了
把这些全配完,重新编译安装 App,打开 Fiddler,刷新页面——熟悉的请求列表终于出现了!JSON 数据、Headers、Cookies 全都能看,调试效率一下回来了。
不过有个小瑕疵:因为关了证书校验,每次启动 App 都会在日志里报一堆 SSL 警告。但这不影响功能,调试完恢复正式配置就行。反正我本地开发也不上线,忍了。
踩坑提醒:这三点一定注意
1. 别只装系统证书:很多教程只说去设置里装 FiddlerRoot.cer,但现代 App 默认不信任用户证书,必须改网络配置或代码。
2. Fiddler 的 HTTPS 解密要手动开:默认只抓 HTTP,HTTPS 得在 Options 里显式开启,而且第一次要用管理员权限运行(Windows 下有时需要)。
3. 移动端时间要对准:有次我手机时间快了两小时,Fiddler 生成的证书还没生效,直接被 App 拒了。调回自动同步时间就好了。
以上是我踩坑后的总结,如果你有更好的方案欢迎评论区交流。比如有没有不用改原生代码的办法?或者用 Charles 怎么处理类似问题?我都想试试。毕竟谁也不想每次调试都去翻 Android 和 iOS 的配置文件。

暂无评论