1. Charles抓包基础与环境准备
第一次接触Charles抓包时,我被它强大的功能震撼到了。这个看似简单的工具不仅能拦截HTTP/HTTPS请求,还能修改请求参数、模拟慢速网络,甚至重写服务器响应。记得有次调试一个支付接口,就是靠Charles修改了0.1元的测试金额,避免了反复充值带来的麻烦。
要在Mac上使用Charles抓取Android设备的网络流量,首先需要确保开发环境正确配置。以下是详细的环境准备步骤:
安装Charles:前往 Charles官网 下载最新版本。虽然它是收费软件,但提供30天免费试用期,对于短期项目完全够用。安装过程很简单,双击dmg文件拖拽到Applications文件夹即可。
网络环境检查:确保你的Mac和Android设备连接在同一个WiFi网络下。我遇到过不少新手因为设备不在同一局域网而无法抓包的情况。可以通过ping命令测试连通性:
ping 192.168.1.100 # 替换为你的手机IP- 获取本机IP:在Charles的Help菜单选择"Local IP Address",或者直接在终端运行:
ifconfig | grep "inet " | grep -v 127.0.0.1记下en0接口的IP地址,通常是192.168.x.x这样的内网IP。
- Android设备准备:进入手机设置->关于手机,连续点击"版本号"7次开启开发者模式。然后在开发者选项中开启"USB调试",这对后续安装证书很有帮助。
2. HTTP抓包配置实战
配置HTTP抓包只需要两个核心步骤,但实际操作中会遇到各种细节问题。上周帮同事调试时,就发现他的手机始终无法连接到Charles,最后发现是公司网络隔离了设备间的通信。
2.1 配置Charles代理端口
- 打开Charles,点击菜单Proxy -> Proxy Settings
- 在HTTP Proxy部分勾选"Enable transparent HTTP proxying"
- 端口默认使用8888,如果冲突可以改为其他值(如8889)
- 建议勾选"Support HTTP/2"以兼容现代网络协议
2.2 配置Android网络代理
- 进入手机WiFi设置,长按当前连接的网络选择"修改网络"
- 在高级选项中找到代理设置,选择"手动"
- 服务器主机名填写刚才获取的Mac IP地址
- 端口填写Charles中设置的端口(默认8888)
- 保存设置后,Charles会弹出连接确认对话框,点击"Allow"
此时在手机浏览器访问任意HTTP网站,Charles界面应该会出现请求记录。如果遇到连接问题,可以尝试以下排查步骤:
- 关闭Mac防火墙:系统设置->隐私与安全->防火墙
- 检查代理设置是否正确:在手机浏览器访问http://charlesproxy.com/getssl,应该能看到Charles的欢迎页面
- 重启Charles和手机网络
3. HTTPS抓包全流程解析
HTTPS抓包比HTTP复杂得多,主要是因为SSL/TLS加密机制。Charles通过中间人(MITM)技术实现HTTPS解密,这需要在设备和电脑上安装特定的根证书。最近帮一个金融App做测试时,就遇到了证书校验失败的问题,花了半天时间才解决。
3.1 Charles SSL代理配置
- 点击Proxy -> SSL Proxying Settings
- 勾选"Enable SSL Proxying"
- 在Include部分添加需要抓包的域名和端口,可以使用通配符*抓取所有HTTPS流量
- 建议将443(HTTPS默认端口)和自定义API端口都加入列表
3.2 证书安装关键步骤
Mac端证书安装:
- Help -> SSL Proxying -> Install Charles Root Certificate
- 在钥匙串访问中找到"Charles Proxy CA"证书
- 双击证书,在信任设置中将"使用此证书时"改为"始终信任"
Android端证书安装(传统方法):
- Help -> SSL Proxying -> Save Charles Root Certificate
- 将生成的.pem文件通过USB或网络发送到手机
- 在手机设置->安全->加密与凭据中选择"安装证书"
- 选择CA证书,找到.pem文件完成安装
Android 7.0+特殊处理:由于Android 7.0开始限制用户证书,需要额外配置:
- 创建res/xml/network_security_config.xml文件:
<network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system"/> <certificates src="user"/> </trust-anchors> </base-config> </network-security-config>- 在AndroidManifest.xml的application标签添加:
android:networkSecurityConfig="@xml/network_security_config"4. 常见问题与深度解决方案
在实际项目中,我遇到过各种抓包失败的情况。以下是几个典型问题及其解决方案:
4.1 证书安装失败问题排查
现象:手机提示"无法安装证书"或"证书格式错误"
解决方案:
- 尝试将.pem证书重命名为.crt后缀
- 使用ADB命令强制安装:
adb push charles.pem /sdcard/ adb shell am start -n com.android.settings/.SecuritySettings- 对于MIUI等定制系统,可能需要关闭"MIUI优化"(开发者选项内)
4.2 抓包显示Unknown问题
现象:HTTPS请求显示为Unknown或乱码
排查步骤:
- 确认Charles的SSL Proxying已启用
- 检查证书是否安装正确(手机设置->安全->信任的凭据)
- 尝试在Charles的SSL Proxying Settings中添加具体域名而非通配符
- 对于使用证书固定(pinning)的App,需要额外处理:
# 使用objection绕过证书固定 pip install objection objection --gadget com.example.app explore -s "android sslpinning disable"4.3 Android高版本兼容性问题
从Android 9开始,系统默认阻止非加密流量,需要在network_security_config.xml中添加:
<domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">your.api.domain</domain> </domain-config>对于Android 10+,还需要在Application标签添加:
android:usesCleartextTraffic="true"5. 高级技巧与实战经验
经过多次项目实战,我总结出一些提升抓包效率的技巧:
5.1 精准过滤请求
Charles默认会捕获所有网络流量,可以通过这些方式过滤:
- 在Filter栏输入关键字(如"api")
- 右键请求选择"Focus"聚焦特定请求
- 在Proxy -> Recording Settings中设置包含/排除规则
5.2 修改请求与响应
调试接口时经常需要修改参数:
- 右键请求选择"Edit"
- 修改Query/POST参数后点击"Execute"
- 对响应选择"Edit Response"可以直接返回自定义数据
5.3 断点调试技巧
设置断点可以拦截特定请求:
- 右键请求选择"Breakpoints"
- 在Proxy -> Breakpoint Settings中配置断点条件
- 请求被拦截时可以修改任意内容
5.4 模拟慢速网络
测试弱网环境表现:
- Proxy -> Throttle Settings
- 选择预设网络类型(如3G)
- 可以自定义带宽、延迟和丢包率
记得有次测试时发现App在2G网络下完全无法使用,就是这个功能帮我们提前发现了问题。
6. 安全注意事项与最佳实践
在金融类App测试中,安全团队曾对我们的抓包操作提出质疑。经过沟通,我们制定了以下安全规范:
- 测试环境隔离:只在测试网络中使用抓包工具,禁止在生产环境配置
- 证书管理:项目结束后立即移除设备上的Charles证书
- 数据加密:敏感数据使用临时测试账号,避免真实数据泄露
- 权限控制:设置Charles密码保护(Proxy -> Access Control Settings)
对于安全性要求高的App,建议开发阶段就建立专用的调试证书体系,而不是依赖Charles的通用证书。