系统证书信任修复 — Android 7+ 用户安装证书不被应用信任
问题根源
Android 7(API 24)以后系统加强了证书安全:
- 应用目标 SDK 24 及以上 → 默认不信任用户安装的证书,只信任系统预装证书
- 只有应用代码里显式在 network_security_config.xml 里声明了信任用户证书,才会信任你手动装的 CA
Google Play 上绝大多数现代应用都把 targetSdk 设在 28+,不会信任用户 CA。所以即使你在 PCAPdroid 向导里顺利装好了 CA 证书,绝大多数应用解密还是会红锁失败。
方案一:root + movecert 模块(推荐)
有 Magisk root 的设备:
- 安装 Magisk 模块 movecert
- 把 PCAPdroid CA 证书先作为用户证书安装(向导里会引导)
- 重启设备,movecert 自动把用户证书搬到系统证书目录
/system/etc/security/cacerts/ - 此时应用看到的 PCAPdroid CA 就和系统预装证书地位一样,全部信任
这是最干净、最不破坏应用的方案,root 用户首选。
方案二:root + LSPosed + sslunpinning
如果应用还做了证书锁定(certificate pinning)——即应用自己内嵌了服务器证书指纹,每次 TLS 握手时主动比对,哪怕系统信任 PCAPdroid CA 也会失败。此时需要用 LSPosed(Xposed)框架配合 sslunpinning 模块:
- 安装 LSPosed 框架(需要 Magisk + Zygisk)
- 安装 sslunpinning 模块并在 LSPosed 里对目标应用启用
- sslunpinning 会 Hook Android 的证书验证链路,跳过 pinning 检查
适用于有 root 且想解通做了证书锁定的主流 App(微信、支付宝等)。
方案三:root + 手动刷系统证书
任意 root 设备都可以手动把证书刷进系统分区:
- 把系统分区挂载为 rw
- 把 PCAPdroid CA 证书拷贝到
/system/etc/security/cacerts/ - 设置正确的文件权限
- 重启
比 movecert 麻烦,但不需要装额外 Magisk 模块。
方案四:Android 模拟器 + root
不想在真机上折腾?用 Android Studio 创建一个 x86_64 或 AArch64 的模拟器:
- 模拟器开启 Google API / Google Play 镜像
- 启动后通过 adb root + adb remount 获取 root
- 重复方案一或方案三的步骤
- 在模拟器里装 PCAPdroid + 目标应用,即可解密
PCAPdroid 2.0.0 以后 mitm 插件不再支持旧 x86 模拟器,需要 x86_64 或 AArch64。
方案五:VirtualXposed 虚拟环境
VirtualXposed(以及类似的虚拟框架)可以让 App 运行在 SDK 23(Android 6.0)的兼容模式下,此时用户证书自动被信任。步骤:
- 安装 VirtualXposed
- 在 VirtualXposed 里安装目标应用(不是 PCAPdroid)
- 在 PCAPdroid 的 Decryption rules 里把 VirtualXposed 添加为解密目标
- 在 VirtualXposed 里启动目标应用,PCAPdroid 即可解密
注意:VirtualXposed 在 Android 11+ 上已停止维护,很多新系统不兼容;某些 App 在虚拟环境里会检测到环境异常而拒绝运行。
方案六:apk-mitm / apktool 重签名
反编译 APK、把 targetSdk 降到 23、重编译并重新签名:
- 用 apk-mitm 工具一键完成(反编译 → 降低 targetSdk → 重建)
- 或者手动用 apktool 反编译、改 AndroidManifest.xml 的
targetSdkVersion→ 23 - 重新编译签名后卸载原 APK、安装新 APK
缺点是原应用如果用 SSO 登录,新签名会导致 SSO 失效——需要先在原 APK 里登录,备份应用数据目录(/data/data/包名),装新版 APK 后恢复数据。
方案七:App 源码 + Android Studio(开发者)
如果你有目标应用的源代码(自己开发的或开源项目),最干净:
- 在 AndroidManifest.xml 里添加 network_security_config
- 在 res/xml/network_security_config.xml 里指定信任 PCAPdroid CA 证书
- 重新编译安装
方案选择速查
| 场景 | 推荐方案 |
|---|---|
| 有 Magisk root,不想改应用 | movecert 模块 |
| 有 root,App 还做了 pinning | LSPosed + sslunpinning |
| 不想在真机上折腾 | Android 模拟器 + root |
| 没 root,想解通 pinning App | apk-mitm 重签名 |
| 有 App 源码 | network_security_config |
<img src="images/cert-trust-error.jpg" alt="TLS 解密证书不被信任错误" title="客户端不信任代理证书" />