Android 7.0+ HTTPS抓包终极方案:将Fiddler证书安装为系统证书

发布时间:2026/6/23 17:57:26

Android 7.0+ HTTPS抓包终极方案:将Fiddler证书安装为系统证书 1. 项目概述为什么Android 7.0让HTTPS抓包变难了如果你是一名移动端开发、测试或者安全研究员肯定对Fiddler、Charles这类抓包工具不陌生。在Android 7.0API 24之前给手机装个抓包工具的CA证书然后设置下代理基本上就能畅通无阻地看到App的HTTPS流量了。但自从Android 7.0引入了一项名为“网络安全配置”的重大变更后这个“畅通无阻”就成了过去式。你会发现很多App特别是银行、支付、社交类的主流应用在Android 7.0及以上的设备上即使正确安装了Fiddler的证书抓到的HTTPS请求依然是乱码或者直接报TLS handshake failure。这背后的核心原因就是证书信任链的改变。简单来说在Android 7.0之前用户安装的证书即“用户证书”和系统内置的证书即“系统证书”在大多数情况下是被同等信任的。App默认会信任用户证书。但从Android 7.0开始为了提升安全性Google修改了默认行为App默认只信任系统预置的证书而不再自动信任用户手动安装的证书。除非App的开发者在自己的App中显式地通过networkSecurityConfig配置声明信任用户证书否则抓包工具的证书将不被认可。显然出于安全考虑几乎没有正规App会主动做这个配置来“方便”你抓包。这就引出了我们今天的核心操作将Fiddler的用户证书转换为安卓系统认可的“系统证书”并安装到系统证书目录中。一旦完成这个操作你的抓包证书就拥有了和谷歌、赛门铁克等根证书颁发机构同等的“系统级”信任地位绝大多数App除非它做了额外的证书固定的HTTPS流量都将对你“透明”。这个操作是解决Android高版本HTTPS抓包难题的“终极”方案之一尤其适合需要对App进行深度测试、逆向分析或协议研究的场景。2. 核心原理与准备工作理解证书与系统信任链在动手之前我们需要把几个关键概念和准备工作理清楚这能帮你避免后面90%的坑。2.1 证书格式与转换PEM、DER、CER与P12Fiddler默认导出的证书格式是.cer或.p12而安卓系统证书需要特定的格式和命名。这里涉及几个关键点Fiddler根证书当你启动Fiddler并开启HTTPS解密时Fiddler会动态生成一个自签名的根证书Root CA Certificate。我们所有操作的核心就是把这个证书“骗”进安卓系统。系统证书要求安卓系统证书存放在/system/etc/security/cacerts/目录下。每个证书文件需要满足两个条件文件名必须是证书持有者名称的MD5哈希值取前8位并以.0作为扩展名。例如f9a66fa3.0。文件格式必须是PEM格式-----BEGIN CERTIFICATE-----开头。所以我们的核心任务链是获取Fiddler根证书 - 转换为PEM格式 - 计算其MD5哈希值 - 重命名并放入系统证书目录。2.2 准备工作清单工欲善其事必先利其器。请确保你已准备好以下环境和条件一台已Root的Android设备或模拟器这是最最最重要的前提。因为/system分区是只读的必须拥有Root权限才能挂载为可写并放入证书。没有Root一切免谈。真机Root风险较高可能失去保修且不同机型Root方法差异巨大。模拟器推荐对于抓包测试雷电模拟器、夜神模拟器等是绝佳选择。它们通常自带Root开关在设置中一键开启即可非常方便。本文后续演示将以雷电模拟器为例。Fiddler Classic确保已安装并配置好基础的HTTP/HTTPS抓包。你需要能从Fiddler导出根证书。ADB工具Android Debug Bridge用于连接电脑和安卓设备/模拟器执行文件推送、Shell命令等。通常包含在Android SDK中也可以单独下载。OpenSSL工具用于证书格式转换和哈希计算。Windows用户可以从 OpenSSL官网 下载安装版或者使用Git Bash、WSL等自带OpenSSL的环境。重要提示操作涉及系统分区存在一定风险。请务必在测试设备或模拟器上进行避免对主力机进行操作。操作前建议对模拟器创建一个快照。3. 详细实操步骤从导出证书到完成安装下面我们一步步来完成整个流程。我会以Windows系统 雷电模拟器为例其他环境思路完全一致。3.1 第一步从Fiddler导出根证书打开Fiddler Classic点击菜单栏的Tools - Options。切换到HTTPS选项卡。点击Actions按钮在下拉菜单中选择Export Root Certificate to Desktop。此时你的桌面上会出现一个名为FiddlerRoot.cer的文件。这就是我们需要的根证书。3.2 第二步转换证书格式并计算哈希Fiddler导出的.cer文件通常是DER编码的。我们需要将其转换为PEM格式并计算MD5哈希。方法一使用OpenSSL命令行推荐通用打开命令行终端CMD或PowerShell导航到桌面或证书所在目录。将DER格式的.cer转换为PEM格式openssl x509 -inform DER -in FiddlerRoot.cer -out FiddlerRoot.pem执行后会生成一个FiddlerRoot.pem文件。用文本编辑器打开它你会看到以-----BEGIN CERTIFICATE-----开头的文本。计算PEM证书的MD5哈希值openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem | head -1在Windows CMD中head -1可能不工作你可以直接用openssl x509 -inform PEM -subject_hash_old -in FiddlerRoot.pem命令会直接输出一个8位的十六进制字符串例如f9a66fa3。记下这个字符串这就是你的证书文件名。方法二使用在线工具或图形化工具备用如果不熟悉命令行也可以使用一些证书工具如Portecle来查看证书详情并获取哈希值但命令行是最直接可靠的。3.3 第三步准备证书文件并推送到设备重命名PEM证书文件将上一步生成的FiddlerRoot.pem文件重命名为[哈希值].0。例如f9a66fa3.pem重命名为f9a66fa3.0。连接安卓设备/模拟器确保模拟器已开启并打开Root权限雷电模拟器在“设置-其他设置”中。打开命令行使用adb devices命令查看设备是否已连接。雷电模拟器的ADB端口通常是5555你可以用adb connect 127.0.0.1:5555来连接。看到设备序列号并显示device即为连接成功。推送证书文件到设备临时目录adb push f9a66fa3.0 /sdcard/这里我们将文件先推送到设备的内部存储/sdcard/方便后续在设备内操作。3.4 第四步挂载系统分区并安装证书这是最关键的一步需要在设备的Shell环境下操作。进入设备的Shell环境adb shell命令提示符会变成rootxxx:/ #或$如果开头是$请输入su命令切换为root用户。挂载系统分区为可读写mount -o rw,remount /system如果上述命令报错可以尝试指定块设备mount -o rw,remount /dev/block/sda6 /system # 设备名可能不同如sda21, sda6等你可以先用mount | grep /system查看当前的挂载信息。复制证书到系统证书目录cp /sdcard/f9a66fa3.0 /system/etc/security/cacerts/修改证书文件权限系统证书需要特定的权限644即所有者可读写组和其他人只读。chmod 644 /system/etc/security/cacerts/f9a66fa3.0可选但建议验证证书信息可以查看一下证书的Subject确认安装正确。openssl x509 -in /system/etc/security/cacerts/f9a66fa3.0 -text -noout | grep Subject应该能看到类似CNDO_NOT_TRUST_FiddlerRoot的信息。恢复系统分区只读属性并重启mount -o ro,remount /system exit # 退出shell adb reboot设备重启后证书才会被系统完全加载。3.5 第五步验证安装与抓包测试验证证书安装设备重启后进入设置 - 安全 - 加密与凭据 - 信任的凭据 - 系统。在长长的列表里你应该能找到名为“DO_NOT_TRUST_FiddlerRoot”或你自定义的证书颁发者名称的证书。这表明证书已成功作为系统证书安装。配置Fiddler与设备代理在Fiddler的Tools - Options - Connections中记住Fiddler监听的端口默认8888并确保勾选了Allow remote computers to connect。查看电脑的局域网IP地址在CMD中输入ipconfig找IPv4地址。在安卓设备的WLAN设置中长按当前连接的Wi-Fi选择“修改网络” - “高级选项” - “代理”选择“手动”然后填入电脑的IP和Fiddler端口如192.168.1.100:8888。进行抓包测试在设备上访问一个HTTPS网站或者打开你想要测试的App。回到Fiddler你应该能看到清晰的HTTPS请求和响应而不再是Tunnel to或乱码。4. 常见问题、排查技巧与高级配置即使按照步骤操作你也可能会遇到一些问题。下面是我在实际操作中踩过坑后总结的排查清单。4.1 证书安装后依然抓不到包这是最常见的问题。请按以下顺序排查证书哈希与文件名核对这是最容易出错的一步。务必确认用于计算哈希的源文件是PEM格式的证书内容。使用的命令是-subject_hash_old对于OpenSSL 1.1.1版本可能需要用-subject_hash但_old兼容性更好。最终放在/system/etc/security/cacerts/下的文件其内容就是PEM格式的纯文本且文件名是[哈希].0。快速验证方法在设备Shell里进入证书目录执行ls -l确认你的证书文件权限是-rw-r--r--644并且大小和其他系统证书类似。系统分区挂载问题如果mount -o rw,remount /system失败可能是因为你的设备/system分区是只读文件系统如erofs或者Remount命令需要更多参数。可以尝试mount -o rw,remount /重挂载根目录使用Magisk模块有一个非常流行的Magisk模块叫“Move Certificates”它可以自动将用户证书转换为系统证书无需手动操作。如果你的设备有Magisk这是更优雅的解决方案。App使用了证书锁定即使证书被系统信任一些安全性极高的App如银行App、某些版本的微信会使用“证书锁定”技术。它们会在App内部预置仅信任特定证书的公钥忽略系统信任链。对付证书锁定需要更高级的逆向手段如使用Xposed模块JustTrustMe、Frida脚本或对App进行重打包这超出了本文范围。代理设置或网络问题确认设备代理设置正确IP和端口无误。关闭设备防火墙和电脑防火墙或为Fiddler添加出入站规则。尝试在设备浏览器中访问http://[电脑IP]:[Fiddler端口]应该能看到Fiddler的欢迎页面。如果不能说明代理连接不通。4.2 使用Magisk模块简化流程强烈推荐如果你设备已经Magisk Root那么整个过程可以简化到极致在Magisk的“模块”仓库中搜索并安装“Move Certificates”模块。按照常规方法在“用户凭据”中安装Fiddler的CA证书就像在Android 7.0之前那样操作。重启设备。模块会自动将用户证书目录下的证书复制到系统证书目录。你只需要去“系统凭据”中确认即可。这是最安全、最便捷的方法避免了手动操作的风险。4.3 模拟器上的特殊注意事项共享网络模拟器通常使用NAT网络。确保电脑和模拟器在同一“局域网”内。有时需要将Fiddler监听的地址从127.0.0.1改为0.0.0.0在Fiddler的Connections设置中。ADB连接如果adb devices找不到模拟器尝试在模拟器设置中重启ADB服务或者使用adb connect命令指定模拟器的特定端口雷电是5555夜神是62001。系统镜像某些模拟器的系统镜像可能精简了openssl工具。如果Shell里没有openssl命令你需要找一个静态编译的openssl二进制文件通过adb push传到设备如/system/xbin/并赋予执行权限chmod 755或者使用busybox提供的命令。4.4 证书的管理与移除安装多个证书重复上述步骤即可每个证书会有自己唯一的哈希文件名。移除系统证书只需再次挂载系统为可写删除/system/etc/security/cacerts/目录下对应的[hash].0文件然后重启设备。清理旧证书如果之前以用户证书方式安装过Fiddler证书建议在“用户凭据”中将其删除避免混淆。5. 深入探究原理延伸与替代方案5.1 为什么是subject_hash_oldOpenSSL提供了两种计算哈希的方式-subject_hash和-subject_hash_old。新算法-subject_hash从OpenSSL 1.0.0开始使用而Android系统为了兼容性长期使用的是旧算法。使用-subject_hash_old能确保计算出的哈希值与Android系统内部计算方式一致从而被正确识别。如果你用新算法计算文件名对不上系统自然找不到这个证书。5.2 除了Fiddler其他抓包工具呢原理完全通用。无论是Charles、mitmproxy还是Burp Suite你都需要找到它们生成的根CA证书然后执行相同的“PEM转换 - 计算哈希 - 重命名 - 推送至系统目录”流程。证书的来源不同但终点相同。Charles在Help - SSL Proxying - Save Charles Root Certificate导出为.pem格式后续步骤相同。mitmproxy证书默认在~/.mitmproxy/mitmproxy-ca-cert.cer同样是PEM格式。Burp Suite在Proxy - Options - Import / export CA certificate导出为DER格式然后用OpenSSL转换。5.3 针对无Root环境的思考对于没有Root权限的真机有没有办法有但都是“曲线救国”且各有局限使用旧版Android系统寻找或刷入Android 7.0以下的系统镜像。在虚拟空间内操作使用像VirtualXposed、太极这样的免Root框架配合专门的抓包模块。这类框架创建了一个虚拟环境可以在其中修改App的信任策略。对App进行重打包使用Apktool等工具反编译App修改其AndroidManifest.xml中的networkSecurityConfig添加信任用户证书的配置然后重新签名安装。这需要一定的逆向工程知识且每个App都需要单独处理无法通用。使用高版本安卓的“用户证书”特性在Android 9.0中用户安装的证书可以被配置为在特定Wi-Fi下使用但这需要设备管理员权限或特定的设备策略对普通用户不友好。综合来看对于需要频繁、通用抓包的测试人员一台Root过的设备或功能强大的模拟器依然是最高效、最稳定的选择。整个流程走下来核心难点其实不在于步骤的繁琐而在于对安卓系统安全机制变化的理解以及对Root环境下系统操作的小心谨慎。一旦成功将证书转为系统证书你会发现之前那些“抓不到”的App纷纷露出了它们的网络请求细节无论是对于调试接口、分析数据流还是安全测试都打开了一扇新的大门。我个人的经验是在雷电模拟器上先完整跑通一遍整个流程熟悉每一个命令和可能报错的地方之后再在真机上操作心里会踏实很多。毕竟模拟器可以随时回滚快照而真机变砖的代价就太大了。

相关新闻