在移動端開發、接口聯調、網絡調試過程中,“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 |
沒有任何工具能獨立覆蓋所有場景,但三個層級組合能應對全部複雜抓包需求。