Android 7+ 抓包神器:用ADB一键导入Charles证书到系统根目录(附模拟器避坑指南)
Android 7+ HTTPS抓包全攻略:从证书处理到模拟器调优
在移动应用开发和安全测试领域,HTTPS抓包是必不可少的调试手段。然而自Android 7.0起,系统默认不再信任用户安装的CA证书,这给开发者带来了新的挑战。本文将深入解析高版本Android系统的证书信任机制,提供一套完整的解决方案,涵盖证书转换、系统写入、模拟器优化等关键环节。
1. 现代Android系统的证书信任机制解析
Android系统的证书信任模型经历了多次演变。在Android 6.0及更早版本中,系统同时信任系统CA存储区和用户CA存储区的证书。但从Android 7.0开始,系统默认只信任系统CA存储区的证书(位于/system/etc/security/cacerts),这是Google加强安全防护的重要举措。
关键变化点:
- 系统级信任:仅识别系统CA存储区的证书
- 用户级限制:用户安装的证书默认不用于网络流量验证
- 应用级例外:应用可通过网络安全配置自定义信任策略
这种改变虽然提升了安全性,但也给开发调试带来了不便。特别是在以下场景中:
- 应用HTTPS通信调试
- API接口分析与验证
- 安全漏洞检测
- 性能优化分析
提示:即使应用设置了
android:networkSecurityConfig,系统根证书仍然是大多数场景下的基础需求。
2. 证书准备与格式转换实战
不同抓包工具生成的证书格式各异,但Android系统要求特定的证书格式和命名规则。以下是主流工具的证书处理方案:
2.1 证书导出指南
| 抓包工具 | 默认证书格式 | 导出路径 |
|---|---|---|
| Charles | .pem | Help → SSL Proxying → Save Charles Root Certificate |
| Burp Suite | .der | Proxy → Options → Import/Export CA Certificate |
| Fiddler | .cer | Tools → Options → HTTPS → Actions → Export Root Certificate |
2.2 OpenSSL转换关键步骤
# 获取证书哈希值 openssl x509 -inform PEM -subject_hash_old -in charles.pem | head -1 # 转换证书格式(示例哈希值为9d4a1b5a) openssl x509 -inform PEM -text -in charles.pem > 9d4a1b5a.0常见问题处理:
- 若遇到
unable to load certificate错误,检查证书文件是否完整 - Windows系统需确保OpenSSL路径已加入环境变量
- 证书哈希值必须与文件名前缀一致
3. ADB操作与系统证书写入
3.1 设备连接与权限准备
不同环境的ADB连接方式:
# 物理设备连接 adb devices adb root adb remount # 夜神模拟器特殊处理 adb connect 127.0.0.1:62001 adb -s 127.0.0.1:62001 root3.2 证书部署完整流程
推送证书到设备临时目录:
adb push 9d4a1b5a.0 /data/local/tmp/挂载系统分区为可写:
adb shell "mount -o rw,remount /system"移动证书到系统CA存储:
adb shell "mv /data/local/tmp/9d4a1b5a.0 /system/etc/security/cacerts/"设置正确权限:
adb shell "chmod 644 /system/etc/security/cacerts/9d4a1b5a.0"
注意:部分定制ROM可能需要额外执行
adb disable-verity才能成功remount
4. 模拟器环境专项优化
主流Android模拟器在证书处理上各有特点,以下是实测数据对比:
| 模拟器 | ADB端口 | 系统分区挂载点 | 特殊要求 |
|---|---|---|---|
| 夜神 | 62001 | /dev/block/sda6 | 需关闭模拟器ADB选项 |
| 雷电 | 5555 | /dev/block/dm-0 | 需手动执行remount |
| 蓝叠 | 5555 | /dev/block/sda1 | 需开启Root权限 |
| Genymotion | 5555 | /dev/block/sda6 | 默认已root |
夜神模拟器避坑指南:
- 关闭模拟器设置中的"启用ADB调试"
- 检查端口占用情况:
netstat -ano | findstr 62001 - 若出现
cannot connect to 127.0.0.1:62001,尝试重启模拟器ADB服务
雷电模拟器特殊配置:
# 解决/system只读问题 adb shell "su -c 'mount -o rw,remount /system'"5. 抓包工具配置与HTTPS解密
完成系统证书部署后,还需正确配置抓包工具:
5.1 代理设置命令
# 全局代理设置 adb shell settings put global http_proxy 192.168.1.100:8888 # 清除代理 adb shell settings put global http_proxy :05.2 各工具SSL配置要点
Charles:
- Proxy → SSL Proxying Settings
- 添加需要抓取的域名或通配符(*:443)
- 启用"SSL Proxying"
Burp Suite:
- Proxy → Options → SSL Pass Through
- 移除不需要绕过的域名
- 确保"Support invisible proxying"启用
Fiddler:
- Tools → Options → HTTPS
- 勾选"Decrypt HTTPS traffic"
- 忽略证书错误警告
验证技巧:
- 访问https://burp或https://charlesproxy.com/getssl检查证书是否生效
- 使用
adb logcat | grep -i cert查看证书加载日志
6. 进阶技巧与故障排查
在实际项目中,我们可能会遇到各种复杂情况。比如某次测试中发现,即使正确安装了系统证书,某些应用仍然无法抓包。这通常是因为:
- 应用使用了证书固定(Certificate Pinning)
- 网络库硬编码了证书校验
- 系统WebView的特殊处理
解决方案矩阵:
| 问题类型 | 检测方法 | 解决手段 |
|---|---|---|
| 证书固定 | 抓包显示"peer not authenticated" | 使用Frida脚本绕过 |
| 非标准端口 | 连接直接失败 | 修改代理规则包含特定端口 |
| HTTP/2问题 | 只有部分请求可见 | 更新抓包工具版本 |
| IPv6流量 | 代理无任何流量 | 禁用设备IPv6或配置工具支持 |
对于顽固的抓包问题,可以尝试以下命令检查系统证书加载情况:
adb shell "ls -l /system/etc/security/cacerts | grep 9d4a1b5a" adb shell "cat /proc/mounts | grep system"在长期实践中,我发现保持一套标准化的抓包环境非常重要。建议专门准备一个测试设备或模拟器镜像,预装所有必要的证书和工具,避免每次都要重复配置。对于团队协作,可以将配置好的模拟器镜像共享给所有成员,大幅提升工作效率。
