Android 7.0+模拟器Fiddler抓包实战:从证书信任到系统级安装

张开发
2026/4/19 3:07:30 15 分钟阅读

分享文章

Android 7.0+模拟器Fiddler抓包实战:从证书信任到系统级安装
1. 为什么Android 7.0无法直接抓取HTTPS流量很多开发者第一次尝试用Fiddler抓取Android 7.0设备的HTTPS流量时都会遇到一个奇怪现象明明已经安装了Fiddler证书却只能看到一堆HTTP Tunnel to xxx.xxx.xxx:443的日志就是看不到具体的HTTPS请求内容。这其实是Android系统在安全机制上的一个重要升级。从Android 7.0API 24开始系统引入了一个关键变化当应用的targetSdkVersion≥24时默认情况下只会信任系统预装的CA证书而不再自动信任用户手动安装的证书。这个机制被称为Network Security Configuration目的是防止中间人攻击MITM。举个生活中的例子就像你去银行办理业务7.0之前的系统只要看到你穿着银行制服用户证书就会放行而7.0之后必须核对工牌上的防伪码系统证书校验才认可你的身份。这种改变虽然增强了安全性却给开发者调试带来了麻烦。2. 快速解决方案对比2.1 降级系统或应用版本最直接的解决方法是使用Android 7.0以下的设备或模拟器。我在实际测试中发现像Android 6.0的模拟器确实可以正常抓包但性能体验确实比较糟糕。以夜神模拟器的Android 5.1.1版本为例adb connect 127.0.0.1:62001 adb install app-debug.apk不过这种方法有两个明显缺点模拟器运行卡顿特别是需要测试复杂应用时无法真实反映应用在新系统上的表现2.2 修改应用的networkSecurityConfig如果你能修改应用代码可以在res/xml目录下创建network_security_config.xml文件network-security-config base-config cleartextTrafficPermittedtrue trust-anchors certificates srcsystem / certificates srcuser / /trust-anchors /base-config /network-security-config然后在AndroidManifest.xml的application标签中添加android:networkSecurityConfigxml/network_security_config这个方法我曾在开发阶段使用过确实有效。但有两个限制需要能修改应用源码正式发布版本不应该保留这个配置否则会降低应用安全性2.3 反编译修改targetSdkVersion对于无法获取源码的情况有些开发者会尝试通过反编译将targetSdkVersion改为23或更低。我实测过这个方法apktool d app-release.apk # 修改AndroidManifest.xml apktool b app-release -o modified.apk但现代应用通常会有签名校验、代码混淆等保护措施这种方法成功率越来越低而且可能违反使用协议。3. 终极解决方案系统级证书安装3.1 准备Fiddler证书首先需要生成兼容Android的证书。由于新版Android拒绝有效期超过2年的证书我们需要使用Bouncy Castle证书生成器关闭Fiddler运行fiddlercertmaker.exe在Fiddler中导出证书Tools → Options → HTTPS → Actions → Export Root Certificate to Desktop3.2 证书格式转换Android系统证书需要特定的格式和文件名。我们需要使用OpenSSL进行转换# 转换CER为PEM格式 openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem # 获取证书哈希值 openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem # 输出示例e5c3944b # 重命名证书文件 ren FiddlerRoot.pem e5c3944b.03.3 模拟器选择与配置不同模拟器的系统目录挂载方式有所不同夜神模拟器Android 9adb connect 127.0.0.1:62001 adb shell mount -o remount,rw / chmod 777 /system/etc/security/cacerts exit adb push e5c3944b.0 /system/etc/security/cacerts雷电模拟器Android 7.1 需要先在模拟器设置中开启磁盘共享然后adb root adb disable-verity adb remount adb push e5c3944b.0 /system/etc/security/cacerts3.4 权限修复有时候推送证书后仍然无法识别这是因为文件权限不正确。可以通过ADB修复adb shell chmod 644 /system/etc/security/cacerts/e5c3944b.0 ls -l /system/etc/security/cacerts | grep e5c3944b # 应该显示-rw-r--r--4. 常见问题排查指南4.1 证书安装后不显示如果证书已放入system/etc/security/cacerts目录但在设置中不显示可能是文件名不正确必须是小写的哈希值.0文件权限不是644证书格式有问题可以用这个命令检查证书有效性openssl x509 -in e5c3944b.0 -text -noout4.2 雷电模拟器特殊配置雷电模拟器有时需要额外设置全局代理adb shell settings put global http_proxy 192.168.1.100:8888如果要清除代理设置adb shell settings delete global http_proxy adb shell settings delete global global_http_proxy_host adb shell settings delete global global_http_proxy_port4.3 其他模拟器适配对于MuMu模拟器等特殊机型可能需要先执行adb shell su mount -o remount,rw /system如果遇到Read-only file system错误尝试adb reboot fastboot fastboot oem unlock fastboot reboot5. 安全注意事项虽然系统级证书安装解决了抓包问题但需要注意测试完成后应该移除证书不要在生产环境中保留可写的system分区敏感数据应该使用证书固定Certificate Pinning对于金融类应用即使安装了系统证书也可能抓包失败这是因为它们使用了更高级的防护措施这种情况需要考虑其他调试方案。在实际项目中我通常会准备一个专门用于调试的模拟器镜像预装好所有开发工具和证书避免每次都要重复配置。这个镜像可以导出为OVA文件方便团队共享。

更多文章