Charles 一直是 iOS 与 Web 开发者的常用抓包工具:直观、可视化、支持 HTTPS 解密,也可以修改请求与响应。然而,在真实项目中你一定遇到过下面这些情况:
- Charles 只有 CONNECT,完全看不到 HTTPS 内容
- 浏览器能抓,App 抓不到
- 某些接口能抓,某些接口抓不到
- 切换 Wi-Fi、4G 都没有变化
- Charles 抓不到任何 TCP 流量
- 抓包界面"空空如也"
这些症状并不是 Charles 的问题,而是网络链路、TLS 证书、HTTP3 协议以及 App 本身的安全策略导致的。要真正解决 Charles 抓不到包的问题,需要"多工具协同",而不是一味地调整代理设置。
一、Charles 抓不到包的核心原因(按出现频率排序)
App 启用了证书 Pinning(最常见)
表现:
- Safari 能抓
- App 完全抓不到
- Charles 面板没有任何请求
原因:App 直接拒绝 Charles 的证书,HTTPS 流量无法被解密,也不会发往 Charles。
HTTPS 证书链未完全信任
表现:
- Charles 只能看到 CONNECT
- 没有明文 HTTPS 内容
- App 提示 SSL 失败或超时
可能原因:
- 中间证书缺失
- Wi-Fi 中间人注入证书
- ATS 拒绝不完整链路
目标接口使用 HTTP/3 / QUIC(UDP),绕过代理
QUIC 使用 UDP,而 Charles 只代理 TCP。
表现:
- 视频、直播、社交类接口抓不到
- 换网络后部分接口能抓
- 抓不到包但后端确实收到请求
应用使用自定义协议(TCP/UDP)或 WebSocket
这类协议不走系统 HTTP 代理,自然抓不到。
系统代理被覆盖或未生效
场景包括:
- VPN 覆盖默认代理
- 公司的 Wi-Fi 强制代理
- iOS 网络配置冲突
二、Charles 抓不到包怎么办?完整排查流程(可直接复用)
步骤 ①:检查 Charles 的 HTTPS 配置是否完整
包括:
- Enable SSL Proxying 是否已勾选
- 证书是否已安装
- iOS 中是否"完全信任"证书
- 端口是否设置正确(一般是 8888)
如果 HTTPS 都没有 → 继续下一步。
步骤 ②:浏览器能抓,但 App 抓不到 → 证书 Pinning
当出现这个情况时,Charles 基本无法继续处理 HTTPS。
此时无需继续尝试代理,应该切换到底层抓包方式。
步骤 ③:部分接口抓不到 → 检查是否为 QUIC
验证方法:
- 切换到 4G/5G
- 禁用 QUIC
- 查看流量是否是 UDP
如果目标是 HTTP/3,那么 Charles 无法抓取是预期行为。
步骤 ④:判断是否为自定义协议或 WebSocket
如果 App 使用的是自定义 TCP 协议,那么:
- Charles 没有请求
- Wireshark 可以看到 TCP 数据
- 代理类工具全部无效
此时只能使用底层抓包软件。
步骤 ⑤:当 Charles 无论如何都抓不到 → 使用底层工具补抓
这一步是解决"代理抓不到包"的关键。
抓包大师(Sniffmaster)如何补充 Charles 的能力?
Sniffmaster 可以解决 Charles 无法覆盖的场景:
- App 使用证书 Pinning
- HTTPS 无法被代理拦截
- QUIC(UDP)流量分析
- 抓取自定义 TCP/UDP 协议
- 系统代理被覆盖
- 按 App / 域名过滤流量,避免干扰
核心功能包括:
- 捕获 HTTPS / HTTP / TCP / UDP 全链路数据
- 自动识别常见协议(HTTPS、HTTP、mdns 等)
- 按 App / 域名过滤,减少噪音
- 支持查看 HEX / 文本数据流
- 可导出 Wireshark 可读取的 pcap 文件
- JavaScript 拦截器可对请求/响应进行修改
这些功能使其适合用于 Charles 失败、代理无法工作、或需要底层抓包的情况。
三、真实工程案例:Charles 完全抓不到 iOS App 流量
场景:
- Charles 代理设置正常
- 证书已安装并"完全信任"
- Safari 可以抓包
- App 完全没有数据
排查过程:
- Charles 设置正常 → 排除代理问题
- Safari 可抓 → 系统代理生效
- App 无流量 → 高度怀疑 pinning
- 使用 Sniffmaster 启动底层数据流捕获
- 导出 pcap 用 Wireshark 查看
- TLS 握手中出现 Alert
- 结论:App 中启用了证书指纹校验
最终:
- 代理工具无法使用
- 通过 Sniffmaster 补抓 + Wireshark 分析才找到根因
这是一个典型的 Charles 失败案例。
解决"Charles 抓不到包"可以采用多工具协同方案
不是换一个代理工具,而是要建立完整抓包链路:
| 层级 | 工具 | 作用 |
|---|---|---|
| 代理层 | Charles / Proxyman / Fiddler | HTTPS 明文分析 |
| 协议层 | tcpdump / Wireshark | TLS 握手排查 |
| 自动化层 | mitmproxy scripting / pyshark | 批量分析 |
| 补抓层 | 抓包大师(Sniffmaster) | pinning / QUIC / 自定义协议等代理解决不了的场景 |
只有这样,才能应对 iOS 上各种复杂的网络问题。