开发朋友应该都遇到过这种情况,打开了 Charles之后,手机上代理也配了,但列表里就是一条请求都没有——或者能看到请求,点开全是乱码。Charles 抓不到 HTTPS 包的原因就那么几类,挨个排查一遍一般能定位到具体原因。

证书问题是最常见的

Charles 抓 HTTPS 需要安装并信任 CA 证书。如果在 iOS 上装了证书但打开 HTTPS 请求还是乱码或显示红色感叹号,检查两个地方:
一是"设置 → 通用 → 关于本机 → 证书信任设置"里有没有把 Charles 的证书开关打开。iOS 10.3 之后安装的描述文件默认不信任,需要手动开启。
二是在 Charles 里重新生成 CA 证书——Help → SSL Proxying → Reset SSL Certificate,证书过期后重新生成并安装到设备上就能恢复。

Mac 端如果遇到"SSLHandshake: certificate_unknown",通常是 Charles 的 CA 证书没被系统信任。打开钥匙串访问,在登录标签页找到 Charles 的证书(默认以 Charles Proxy CA 命名),展开信任列表,把"使用此证书时"改成"始终信任"。改完后记得重启 Charles。

代理配置与网络环境

手机配了代理但抓不到包,先确认手机和电脑连接的是同一个 Wi-Fi 网络。Charles 的代理默认端口是 8888,在 Proxy → Proxy Settings 里可以查看当前端口号,检查电脑防火墙有没有拦截这个端口。如果手机上开了 VPN 或者网络代理类软件,会和 Charles 的代理冲突——VPN 走的是虚拟网卡接口,流量不经过 Wi-Fi 代理链路,关掉 VPN 再试。Windows 上如果用的是 Clash 之类的代理工具,需要关闭系统代理或者把 Charles 加到规则白名单里。

还有一个容易忽略的问题:Android 7.0 以上默认不信任用户安装的证书,App 如果 targetSdkVersion 大于 24 并且没有在 manifest 里配置网络安全策略,Charles 的代理证书会被拒绝。这种情况要么修改 App 的网络安全配置,要么用 VirtualXposed 等工具绕过。

遇到 SSL Pinning 时的选择

如果 App 做了 SSL Pinning(证书绑定),Charles 的 MITM 代理证书会被客户端直接拒绝。常规做法是用 frida + objection 做运行时 hook 来禁用证书校验,但这需要越狱或侧载环境。另一种方式是换一个不走代理通道的抓包工具,SniffMaster 的暴力抓包模式就是走的这个思路——iOS 设备通过 USB 连上 Mac,选择 HTTPS 暴力抓包,不需要配置代理和安装信任证书。即使 App 设置了双向证书验证,暴力抓包也能正常解密。缺点是被抓的 App 需要用开发证书签名才能看到完整的请求体,Store 版应用只能看到请求头和地址。

如果只是日常调试不走 SSL Pinning 的普通接口,SniffMaster 的代理抓包模式和 Charles 基本类似,但证书安装流程有操作引导,会提示每一步该做什么,减少配置遗漏。

Charles 在大部分日常抓包场景下已经足够好用,遇到 SSL Pinning 或者证书环境比较复杂的情况,工具里备一个 SniffMaster 就行。