快速自查
首次抓包失败时,按顺序解决基础问题。
第一步查看Charles主界面右下角的圆形按钮,必须是红色的Recording状态;如果是灰色,表示录制未开启,点击一次即可。第二步,检查Charles代理端口是不是正常监听。在终端执行lsof -iTCP:8888 -sTCP:LISTEN -nP,应能看到进程名和 LISTEN 状态,如果没有,可能是端口被占用或防火墙拦截。第三步,客户端的代理设置。以手机为例,进入 Wi-Fi 详情,将 HTTP 代理设为手动,填写 Charles 所在电脑的 IP 地址和端口8888,必须保证和本机一致。第四步,证书已安装且被系统信任。macOS上,打开钥匙串访问,找到Charles Proxy CA,右键进入显示简介,在信任中将使用此证书时改为始终信”。iOS 设备安装证书后,还必须前往设置→通用→关于本机→证书信任设置,将对应证书的开关打开,这步易被忽略。第五步,检查SSL代理设置。点击 Proxy 菜单下的 SSL Proxying Settings,在Include列表中至少应包含一个通配符条目(如 *.*:443),否则所有 HTTPS 流量只会显示为CONNECT隧道,看不到明文内容。
准确排查
证书方面的异常
如果所有HTTPS请求都呈现为一行CONNECT隧道,点击后没有标头和响应体,基本是Charles根证书未被正确安装或信任。按照前述方法重新安装证书并设置为始终信任即可。如果请求列表中部分显示为 <unknown>,内容面板全是乱码,这说明对应域名的SSL解密未启用。解决方法是打开SSL Proxying Settings,将目的域名或 *.*:443 加入 Include 列表,然后刷新请求。还有一种场景:刚配置时抓包正常,过一段时间突然失效,乱码重现。这一般是因为Charles生成的自签名根证书已过期。进入 Help→SSL Proxying→Reset Charles Root Certificate,重置后重新安装并信任新证书即可恢复。iOS 用户请再次检查证书信任开关;Android 7.0 以上系统默认不信任用户自定义证书,如果非debug版应用,需root后将证书移入系统证书目录。
代理和网络环境的冲突
当Charles面板完全空白,无任何请求出现时,先确定客户端确实使用了Charles代理。如果手机Wi-Fi已配置代理,却仍无弹窗提示连接,可以让手机忽略此网络,重新输入密码连接,或彻底重启 Charles 客户端。如果您身处企业、酒店等公共网络,网关很可能部署了中间人检测,主动阻断 Charles 的代理证书握手,表现为所有请求都被拒绝。此时最直接的方案是切换至手机个人热点,绕过企业网络限制。另外,如果电脑本身开启着VPN 或Clash 等全局代理工具,会劫持网络路由,导致流量不经 Charles。请必须先关闭这些软件再开始抓包。如果目的应用访问的是电脑本机服务(如 localhost:3000),由于操作系统对 localhost/127.0.0.1 硬编码绕过代理,Charles 将无法拦截。请将代码中的请求地址改为 localhost.charlesproxy.com,代理就能正常捕获。
协议方面的失效
某些应用,尤其是金融、支付类 App,会采用证书锁定(SSL Pinning),即App代码中只信任预埋的特定证书,完全拒绝 Charles 等中间人证书,导致相关请求静默消失。代理方面无法突破此限制,需改用 Wireshark、tcpdump 等底层抓包方案导出pcap文件进行分析。此外,如果只有部分接口抓不到,且这些接口多为视频流、实时推送等,很可能是因为它们使用了根据 UDP 的 HTTP/3(QUIC)协议,而 Charles 是根据TCP的代理。在电脑浏览器地址栏输入 about:flags,搜索QUIC协议并将其禁用,然后重试,一般可以迫使流量回退到TCP供代理捕获。
客户端配置和软件干扰
收到响应后,JSON 中的中文显示为乱码,是编码设置所致。Windows 用户可在 Charles 安装目录下的Charles.ini中追加 vmarg.3=-Dfile.encoding=UTF-8;Mac 用户则可通过Rewrite功能强制为响应添加Content-Type: application/json; charset=utf-8 头来解决。
如果电脑安装过多个版本的 Charles,即使当前配置完全正确也可能无法抓包,这是版本冲突造成的。请彻底卸载所有版本后,重新安装单一版本。如果此前设置过过滤条件,现在面板一片空白,很可能是 Sequence 搜索框、Proxy Settings 中的 Include/Exclude 规则或 DNS Spoofing、Map Remote等残留的规则在起作用,逐一清空即可恢复。
请求状态码异常
当请求列表出现大量 Connection Refused 或 Timeout,提示代理和目的服务器间链路不通。可在终端执行 nc -vz <charles_ip> 8888 测试连通性,亦可通过手机浏览器访问 http://charlesproxy.com/getssl 证实代理是不是可达。如果状态码返回 200 但响应体为空或 data 为 null,这往往是接口业务思路问题,而不是抓包失败。可借助 Charles 的断点功能修改请求参数,对比不同参数下的响应差别来定位。如果观察到 iOS 端正常、Android 端异常(或反之),多为不同平台发出的请求 Header 存在差别,请分别抓包对比 Content-Type、User-Agent 等字段。
排查顺序
建议按以下顺序排查,避免遗漏:
确定 Recording 按钮已点亮为红色;
通过 lsof 命令证实端口 8888 正常监听;
检查客户端代理的 IP 和端口和 Charles 本机配置一致;
检查根证书在系统内被始终信任,iOS 证书信任开关已打开,SSL Proxying 已添加目的域名;
清空所有过滤规则、Map 映射等历史残留设置;
关闭VPN及全局代理,必要时切换个人热点以排除网络网关干扰;
协议方面:浏览器禁用 QUIC;如果 App 无法抓包而浏览器正常,初步断定为证书锁定;
如果以上无效,采用 tcpdump、Wireshark 等工具导出 pcap 进行底层协议分析。