Android抓包环境搭不起来,很多时候不是工具本身难用,而是代理端口、证书信任、应用目标版本这几个环节没有同时打通。Charles和Fiddler在PC端都足够成熟,但把它们接到Android设备上时,配置路径和踩坑点确实存在差异。下面会分别说明两套工具的完整配置过程,并补充Android系统对证书信任的限制,帮助你把明文请求稳定地抓到手里。

一、Charles抓包配置:代理、证书与SSL代理设置
先在PC上启动Charles,确认本机局域网IP地址。手机和电脑需要连接同一个Wi-Fi,然后在Charles菜单中查看Proxy设置,默认HTTP代理端口通常为8888。建议在Proxy Settings中把HTTP Proxy端口固定为8888,并勾选Enable transparent HTTP proxying选项,这样后续手机端只需要填IP和端口即可。
Android手机进入Wi-Fi详情页,把代理从无改为手动,主机名填写PC的局域网地址,例如192.168.1.100,端口填写8888。保存后手机浏览器访问chls.pro/ssl,Charles会提供一个证书下载页面。下载并安装证书时,Android会提示证书用途,选择用于VPN和应用即可。安装完成后,还需要在Charles中开启SSL Proxying,否则HTTPS请求只会显示CONNECT隧道,看不到请求和响应内容。
开启方式是在Proxy菜单下找到SSL Proxying Settings,勾选Enable SSL Proxying,并添加需要解密的域名与端口。这里不建议直接填写通配符*去匹配所有域名,因为部分证书绑定较强的应用会拒绝连接。更稳妥的做法是先针对目标域名添加规则,例如api.ipipp.com:443,等确认抓包正常后再逐步扩大范围。
# Charles SSL Proxying Settings 示例 # 只对目标域名开启解密 Host: api.ipipp.com Port: 443 # 调试多个子域名时使用 Host: *.ipipp.com Port: 443
证书安装完成后,如果应用仍然报证书错误,通常是因为Android 7.0及以上版本默认不信任用户安装的根证书。此时需要通过adb把Charles根证书推送到系统证书目录,或者使用已root的设备。对于普通模拟器,处理起来会比较方便,部分模拟器本身就允许直接导入系统证书。
二、Fiddler抓包配置:端口、HTTPS与证书导出
Fiddler的代理端口也可以在Tools菜单下的Options里调整。打开Options后进入Connections选项卡,确认Fiddler listens on port后面是8888,并勾选Allow remote computers to connect。这个选项如果不打开,手机连上代理后会出现网络不通的情况。配置完成后重启Fiddler,让远程连接设置生效。
HTTPS解密需要进入HTTPS选项卡,勾选Capture HTTPS CONNECTs和Decrypt HTTPS traffic。Fiddler会提示安装根证书到本机,按提示操作即可。Android手机需要安装Fiddler的根证书,可以在手机浏览器中访问http://电脑IP:8888,页面底部有FiddlerRoot certificate下载链接。下载后安装证书,并同样选择用于VPN和应用。
如果证书安装完成但部分应用仍然不信任连接,可以把Fiddler根证书从PC导出。在Fiddler的Actions菜单中可以选择Export Root Certificate to Desktop,导出的cer文件可以通过adb推送到设备中。对于需要系统级信任的场景,cer文件还需要转换成Android系统可识别的格式,并放置到系统证书目录下。
# Fiddler 默认代理配置 Fiddler listens on port: 8888 Allow remote computers to connect: true # HTTPS 解密 Capture HTTPS CONNECTs: true Decrypt HTTPS traffic: true
Charles和Fiddler在配置逻辑上很相似,但Fiddler对Windows环境的兼容性更好,适合在Windows开发机上快速排查HTTP接口问题。Charles则更擅长查看长连接、WebSocket以及更复杂的请求结构。在实际项目中,如果只做普通接口抓包,任意一个工具都能满足需求。
三、Android 7.0以上的证书限制与系统证书方案
Android 7.0开始,系统对用户证书和系统证书做了明确区分。用户在设置中安装的证书属于用户证书,默认情况下只有浏览器和部分旧版本应用会信任它。很多正式打包的应用由于启用了网络安全配置,只信任系统证书,这就导致即使手机已经安装Charles或Fiddler证书,请求仍然会报SSL错误。
解决这个问题的思路通常有两种。一是将抓包工具的根证书安装到系统证书目录。以Charles为例,先把证书导出为PEM格式,然后用adb连接设备,将证书文件推送到/system/etc/security/cacerts/目录下。该操作需要root权限,并且要保证证书文件名与证书主题哈希值一致。对于没有root的真机,可以先使用模拟器或测试机完成配置。
# 查看证书主题哈希值 openssl x509 -inform PEM -subject_hash_old -in charles.pem # 输出类似: # 1a2b3c4d # 将证书重命名后推送 adb root adb remount adb push 1a2b3c4d.0 /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/1a2b3c4d.0
第二种思路是借助VirtualXposed、平行空间这类工具,把目标应用运行在虚拟环境中。虚拟环境会重新处理证书信任关系,部分场景下可以让应用直接信任用户安装的证书。不过这种方式并不适用于所有应用,尤其是带加固或环境检测的应用,可能会直接崩溃或拒绝运行。真正稳定的做法仍然是使用测试包或debug包,并在AndroidManifest或网络安全配置中显式声明信任用户证书。
四、Android端代理与测试环境注意事项
手机连接代理后,如果PC端抓包工具显示大量CONNECT请求但没有实际接口内容,基本可以判断是SSL Proxying没有覆盖目标域名。Charles需要手动添加域名规则,Fiddler则需要确认Decrypt HTTPS traffic已经勾选。另一个常见的坑是应用使用双向证书校验,此时仅安装抓包根证书是无效的,还需要将客户端证书导入抓包工具中。
对于使用OkHttp、Retrofit等网络库的应用,代理设置会直接沿用系统Wi-Fi代理,因此普通HTTP请求通常可以直接抓到。但如果应用内部自定义了网络栈或使用了原生Socket通信,就需要额外关注是否绕过系统代理。此时可以在PC端使用透明代理模式,或者在路由器层面做流量转发。
调试完成后,一定要把Android手机的代理设置改回无,并且删除抓包证书。否则后续正常使用手机时,所有流量会继续经过PC代理,一旦电脑关机或抓包工具退出,手机就会出现无法上网的情况。证书残留也会带来安全隐患,尤其是测试机之后可能被用于登录真实账号。
# 检查是否真正移除代理 adb shell settings get global http_proxy # 如果输出为空或 :0 表示未设置代理 # 清理用户证书 # 进入设置 -> 安全 -> 加密与凭据 -> 用户证书 # 找到 Charles/Fiddler 证书并删除
总体而言,Charles和Fiddler在Android抓包中的核心区别集中在界面和高级功能层面,基础代理配置是相通的。只要把端口、证书、HTTPS解密、系统信任这几个点依次处理到位,大部分接口调试工作都能顺利完成。