在移动端开发、接口联调、网络调试过程中,"Charles 抓不到包" 是开发者遇到的最高频问题之一。尤其是在 iOS 环境下,ATS、证书链校验、App 内证书 Pinning、HTTP/2、HTTP/3(QUIC)等机制会导致代理抓包工具失效。开发者往往只看到 CONNECT、空白请求列表,或者部分 API 能抓、部分完全看不到。
很多人会误以为是 Charles 配置错误,但实际上,大多数抓不到包的问题与 网络协议本身的工作机制 相关,而不是工具本身的问题。
本文从工程角度系统分析 Charles 无法抓包的原因,并给出对应的分层解决方案。
一、Charles 抓不到包的常见原因(按出现频率排序)
证书未被完全信任(iOS/macOS)
Charles 的 HTTPS 解密依赖"受信任的代理证书"。如果:
- 未安装证书
- 未开启"完全信任证书"
- 中间证书不完整
- 证书链被 Wi-Fi 或代理干扰
Charles 会只显示 CONNECT,无法解密。
应用启用了证书 Pinning
Pinning 会拒绝所有中间人代理证书,是 App 抓不到包的第一常见原因。
表现:
- Safari 可以抓
- App 完全看不到请求
- Charles 无流量
- Wireshark 可看到 TLS Alert
在这种情况下,Charles 无法工作,需要使用底层抓包方案。
部分 API 抓不到 → HTTP/3(QUIC)导致
QUIC 使用 UDP,不走系统代理,因此 Charles/Proxyman/Fiddler 无法抓到任何 QUIC 请求。
常见于:
- 视频类接口
- 大流量实时场景
- 内容流 / 推荐流
- CDN 边缘节点
此时只能通过底层抓取或关闭 QUIC 解决。
App 使用自定义协议(TCP/WebSocket)
许多 SDK 或业务数据走自定义二进制协议,不经过 HTTP 代理,因此:
- Charles 看不到
- 代理软件无流量
- tcpdump 或 Sniffmaster 才能看到真实数据流
系统代理被覆盖(非常常见)
包括:
- VPN
- 安全管控软件
- MDM 企业策略
- 多代理冲突
- WireGuard/Clash 等覆盖全局路由
导致 Charles 根本接收不到请求。
二、排查 Charles 抓不到包的正确流程
① 检查证书链(HTTPS 解密失败)
必查项目:
- iOS "完全信任证书" 是否开启
- Charles 的证书是否最新
- 是否存在 Wi-Fi 中间代理
- ATS 是否拒绝中间人证书
如果只有 CONNECT 多半是证书问题。
② 浏览器能抓、App 抓不到 → 典型 Pinning
这是 70% 的开发者误判为"Charles 配置错误"的场景。
解决方式: Charles 无法处理 需要底层抓包工具进一步分析 TLS 握手
③ 某些接口抓不到 → QUIC/UDP
验证方式:
- Wireshark 查看是否出现 UDP 443
- Safari 刷不出数据,但 App 出现大量 UDP
- Fiddler/Charles 只有部分接口显示
QUIC 天生绕过代理,因此不能被 Charles 抓到。
④ 完全无流量 → 系统代理无效
需要检查:
- 网络描述文件(MDM)
- VPN 状态
- macOS 代理是否被覆盖
- iOS Wi-Fi 是否被企业代理修改
三、Charles 抓不到包时的底层补抓方法(关键环节)
当代理工具无法抓包时,必须使用支持 底层数据流捕获 的工具,直接捕获真实的:
- HTTPS/TCP 数据流
- TLS 握手
- UDP/QUIC
- 自定义协议数据
- App 内网络框架发送的所有数据
Sniffmaster 在 Charles 抓不到包场景中的作用)
Sniffmaster 能做什么?
- 抓取 HTTPS / TCP / UDP 真实数据流
- 自动识别协议类型(HTTP、HTTPS、mdns 等)
- 支持按 App / 域名过滤流量,减少噪音
- 查看数据流文本、HEX、二进制内容
- 用 JavaScript 拦截器改写请求/响应(非 pinning 场景)
- 导出 Wireshark 可读取的 pcap
- 跨平台支持 macOS / Windows / iOS
尤其适用于:
- Charles 抓不到 HTTPS(pinning)
- QUIC 流量抓不到
- WebSocket 二进制协议
- 自定义 TCP 协议
- 系统代理失效
它不是替代 Charles,而是 Charles 的补充工具。
四、完整实战:Charles 抓不到包的排查示例
现象:
- iOS App 完全抓不到包
- Charles 显示 CONNECT
- Safari 可抓
- App 报网络错误
排查步骤:
✔ 第一步:检查证书
无异常。
✔ 第二步:检查系统代理
可正常工作。
✔ 第三步:初步判断为 pinning
代理工具失效。
✔ 第四步:使用 Sniffmaster 捕获底层数据流
捕获 TLS 握手失败的记录:
- Wireshark 分析 pcap → 出现
unknown_ca - 表示 App 拒绝代理证书 → pinning 生效
最终定位到 App 内部 SDK 使用了证书指纹校验。
Charles 抓不到包的解决方案可以"分层抓包"
| 层级 | 工具 | 作用 |
|---|---|---|
| 代理层 | Charles / Proxyman / Fiddler | 业务层 HTTPS 抓包 |
| 协议层 | Wireshark / tcpdump | 分析 TLS 握手、QUIC、TCP |
| 补抓层 | 抓包大师(Sniffmaster) | 捕获 HTTPS/TCP/UDP 底层数据流、解决 pinning/QUIC |
没有任何工具能独立覆盖所有场景,但三个层级组合能应对全部复杂抓包需求。