Android 7+ 系统证书:绕过网络安全限制
问题背景
Android 7.0(API Level 24)引入了 网络安全配置(Network Security Config) 机制。从这个版本开始:
- 默认情况下,应用不再信任用户手动安装的 CA 证书
- 只有系统预置的证书才会被信任
- 很多应用(尤其是大厂的 App)明确配置了只信任系统证书
这意味着即使你已经按上一页的步骤正确安装了 httpCanary 的 CA 证书,在某些应用里 HTTPS 仍然抓不到。
解决方案总览
| 方案 | 是否需要 Root | 难度 | 覆盖范围 |
|---|---|---|---|
| 导出证书 + 应用内 network_security_config | 否 | 中 | 仅限自己开发的 App |
| 将证书安装为系统证书 | 是 | 高 | 所有应用 |
| 模拟器安装系统证书 | 否 | 低 | 模拟器内所有应用 |
| VirtualApp 平行空间 | 否 | 中 | 平行空间内的应用 |
方案一:network_security_config(自己开发的 App)
如果你抓的是自己写的 App,在项目中添加网络安全配置即可:
<!-- 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"
这样 App 就会同时信任系统证书和用户证书,httpCanary 的 CA 证书就能被正常识别。
方案二:系统证书(需要 Root)
如果设备已 Root,可以把证书复制到系统证书目录,让 Android 把它当作预装证书来信任:
- 在 httpCanary 设置中导出根证书(PEM 格式)
- 把证书文件重命名为系统证书格式:
<hash>.0,hash 值可以用 openssl 计算 - 通过 Root 管理器把文件复制到
/system/etc/security/cacerts/ - 设置文件权限为
644 - 重启设备
具体的 hash 计算和命令可以参考网络上的详细教程,不同手机 ROM 可能略有差异。
方案三:模拟器(最省心)
在 Android 模拟器中,网络安全限制可以轻松绕过:
- 在模拟器设置中开启 Writable System Image
- 用 adb 把证书 push 到系统目录:
adb push HttpCanary.pem /system/etc/security/cacerts/ - 重启模拟器
这是很多开发者的首选方案——不用 Root,随时重置,而且模拟器环境干净不污染真机。
方案四:VirtualApp 平行空间
VirtualApp 是一个免 Root 的 App 虚拟化框架,它会在自己的环境内独立管理证书。把目标 App 安装到 VirtualApp 中,再配合 httpCanary 抓包,可以绕过宿主系统的网络安全限制。
缺点是兼容性有限——某些使用特殊机制的 App(比如微信支付、银行 App)可能无法在 VirtualApp 中正常运行。
与 SSL Pinning 的区别
Android 7+ 的网络安全限制是 系统级 的,而 SSL Pinning(证书固定)是 应用级 的另一个机制——应用在代码里硬编码了服务器证书指纹,和系统/用户信任链都无关。如果应用开启了 SSL Pinning,就算把 httpCanary 的证书装成系统证书也没用,需要用 JustTrustMe 等 Xposed 模块来 Hook 绕过。详见 SSL Pinning 绕过。