
1. Android高版本抓包的核心痛点如果你最近尝试在Android 7.0及以上版本的设备上抓包可能会遇到一个让人头疼的问题明明已经安装了抓包工具的CA证书系统却提示已安装证书授权中心 受到不明第三方的监控导致HTTPS流量无法正常解析。这个问题的根源在于Android 7.0引入的网络安全策略变更。在Android 7.0之前系统会信任所有安装在用户证书目录下的CA证书。但从7.0开始系统默认只信任预装在/system分区中的系统证书不再自动信任用户安装的CA证书。这个设计主要是为了防止中间人攻击提升系统安全性但却给开发者和安全测试人员带来了不小的麻烦。我最近在一个金融类App的安全测试中就遇到了这个问题。客户要求测试App在Android 11设备上的安全性但无论我怎么安装Charles的证书App始终无法建立HTTPS连接。经过一番折腾终于找到了几种可靠的解决方案下面我会详细分享这些实战经验。2. 证书准备与格式转换2.1 从抓包工具导出证书首先我们需要从抓包工具中导出CA证书。以Burp Suite为例你可以通过以下步骤导出证书打开Burp Suite进入Proxy - Options选项卡在Proxy Listeners部分点击Import/export CA certificate按钮选择Export certificate in DER format保存为burp.cer文件Charles等其他抓包工具的导出方式类似通常在代理设置或CA证书管理部分可以找到导出选项。如果你使用的是Fiddler证书导出路径在Tools - Options - HTTPS选项卡中。2.2 证书格式转换Android设备对证书格式有一定要求导出的证书可能需要转换格式。常见的问题包括导出的证书是DER格式(.cer)但Android需要PEM格式(.crt或.pem)证书扩展名不被Android识别证书链不完整我推荐使用OpenSSL进行格式转换这是最可靠的方法。以下是转换命令示例# 将DER格式转换为PEM格式 openssl x509 -inform DER -in burp.cer -out burp.crt # 如果需要查看证书详情 openssl x509 -text -in burp.crt -noout如果你不熟悉命令行也可以使用浏览器进行转换。以Firefox为例打开Firefox选项进入隐私与安全 - 证书 - 查看证书在证书管理器中导入之前导出的burp.cer文件选择该证书并导出格式选择PEM证书链或PEM证书转换完成后你会得到一个.crt或.pem文件这就是我们需要安装到Android设备上的证书。3. 安装用户证书的常规方法3.1 将证书传输到Android设备有几种方式可以将证书文件传输到Android设备USB数据线连接将证书文件复制到设备存储的任意目录比如Download文件夹通过ADB命令推送adb push burp.crt /sdcard/Download/通过电子邮件或云存储应用发送到设备我个人更喜欢使用ADB命令因为它不需要数据线反复插拔特别是有多台测试设备时效率更高。3.2 在Android设备上安装证书证书传输到设备后按照以下步骤安装打开Android设置进入安全或加密与凭据选择安装证书或从存储设备安装浏览找到之前传输的burp.crt文件为证书命名如Burp CA然后确认安装安装完成后你可以在信任的凭据 - 用户标签下看到新安装的证书。但这时候问题来了 - 在Android 7.0设备上大多数App仍然不会信任这个用户证书。4. 解决证书不信任问题4.1 方法一将证书安装为系统证书这是最彻底的解决方案但需要设备已root。具体步骤如下获取证书的hash值openssl x509 -subject_hash_old -in burp.crt命令输出第一行就是hash值比如a1b2c3d4将证书重命名为hash值加.0后缀cp burp.crt a1b2c3d4.0将证书文件推送到系统证书目录adb push a1b2c3d4.0 /system/etc/security/cacerts/设置正确的文件权限adb shell chmod 644 /system/etc/security/cacerts/a1b2c3d4.0 adb shell chown root:root /system/etc/security/cacerts/a1b2c3d4.0对于Android 14及以上版本还需要将证书复制到新的APEX目录adb push a1b2c3d4.0 /apex/com.android.conscrypt/cacerts/常见问题解决如果遇到/system分区只读的问题可以尝试以下命令重新挂载adb root adb remount如果设备厂商锁定了system分区可以尝试使用Magisk的Move Certificates模块它会自动将用户证书复制到系统证书目录。4.2 方法二修改APK的网络配置如果无法root设备可以尝试修改目标APK的网络配置。这种方法适用于你自己开发的App或可以重新打包的第三方App。使用apktool反编译APKapktool d target.apk -o output_dir检查或添加networkSecurityConfig 在AndroidManifest.xml的 标签中添加或修改android:networkSecurityConfigxml/network_security_config创建或修改res/xml/network_security_config.xml文件?xml version1.0 encodingutf-8? network-security-config base-config trust-anchors certificates srcsystem / certificates srcuser / /trust-anchors /base-config /network-security-config重新打包并签名APKapktool b output_dir -o modified.apk jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore your.keystore modified.apk alias_name这种方法的好处是不需要root权限但缺点是如果APK有签名校验或加固保护重新打包可能会导致App无法运行。4.3 方法三使用ADB临时挂载证书这是一个比较新的解决方案由HTTP Toolkit团队提出可以在不永久修改system分区的情况下加载系统证书。创建一个临时目录并复制现有系统证书adb shell mkdir -m 700 /data/local/tmp/htk-ca-copy adb shell cp /system/etc/security/cacerts/* /data/local/tmp/htk-ca-copy/在系统证书目录上挂载tmpfsadb shell mount -t tmpfs tmpfs /system/etc/security/cacerts将证书复制回挂载点adb shell mv /data/local/tmp/htk-ca-copy/* /system/etc/security/cacerts/ adb shell cp /sdcard/burp.crt /system/etc/security/cacerts/a1b2c3d4.0设置正确的权限adb shell chown root:root /system/etc/security/cacerts/* adb shell chmod 644 /system/etc/security/cacerts/* adb shell chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*这种方法的优点是无需永久修改系统重启后更改会自动恢复。缺点是每次重启后都需要重新执行这些步骤。5. 针对不同Android版本的优化策略不同Android版本对证书的处理方式有所不同我们需要根据目标设备的Android版本选择合适的方案。Android 7.0-13系统证书目录/system/etc/security/cacerts/主要问题不信任用户证书解决方案上述三种方法都适用Android 14新增APEX证书目录/apex/com.android.conscrypt/cacerts/变化系统证书通过APEX机制动态更新解决方案需要同时向两个目录安装证书或使用Magisk模块针对不同targetSdkVersion的ApptargetSdkVersion 24信任用户证书targetSdkVersion 24默认不信任用户证书特殊框架应用如Flutter可能需要额外配置在实际测试中我发现金融类App通常会将targetSdkVersion设置为较高版本并且会额外实现证书固定(Certificate Pinning)这种情况下即使安装了系统证书也可能无法抓包需要配合其他技术如Frida来绕过证书检查。6. 常见问题排查与解决即使按照上述方法操作实践中仍可能遇到各种问题。以下是我总结的一些常见问题及解决方法问题1证书已安装但抓包仍失败检查证书是否真的被系统信任尝试用设备浏览器访问https网站验证基础抓包功能检查App是否实现了证书固定问题2ADB无法remount system分区尝试不同的remount命令adb root adb disable-verity adb reboot adb root adb remount某些设备需要特定的解锁命令参考厂商文档问题3Magisk模块安装失败确保Magisk版本是最新的检查设备是否真的已root尝试其他证书管理模块如MagiskTrustUserCerts问题4修改APK后无法运行检查APK签名是否正确确认是否绕过了签名校验尝试使用原始签名证书重新签名问题5特定浏览器不信任证书Chrome浏览器有独立的证书信任策略Firefox需要启用信任第三方CA证书选项系统WebView可能也有特殊要求在最近的一个项目中我遇到一个特别棘手的情况设备是Android 12system分区完全锁定无法root目标APK又有加固保护。最终是通过结合ADB临时挂载证书和Xposed模块绕过证书检查才解决问题。这种复杂情况需要根据具体环境灵活应对。