ProxyPin Android 抓不到 HTTPS 用户证书限制
问题根源
Android 有两类证书存储:
| 类型 | 存储位置 | 谁信任 |
|---|---|---|
| 用户证书 | 设置 → 安全 → 证书 | 浏览器等少数应用 |
| 系统证书 | /system/etc/security/cacerts/ | 所有 App(Android 7.0+) |
从 Android 7.0(API 24)开始,应用默认只信任系统证书——用户手动安装的证书只对浏览器等豁免了的应用生效。
这就是为什么很多人装了 ProxyPin 证书但大部分 App 仍然抓不到 HTTPS。
解决方案
方案一:Root + 移动到系统证书目录
最彻底的方案,一劳永逸解决所有 App:
- ProxyPin 下载根证书到设备
- Root 设备(Magisk、SuperSU、或模拟器自带 root)
- 用 Root 权限把证书移动到系统目录:
# adb shell 进入设备
su
cp /sdcard/Download/proxypin.crt /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/proxypin.crt
文件名需要符合 hash.0 格式。先算 hash:
openssl x509 -inform PEM -subject_hash_old -in proxypin.crt
# 输出 abcd1234,最终文件名应该是 abcd1234.0
- 重启设备
方案二:Flutter App 用 ProxyPin 原生绕过
ProxyPin 内置 Flutter 证书固定绕过,即使没 root 也能抓到 Flutter App 的 HTTPS:
→ 详见 Flutter 绕过证书固定
方案三:给自己的 App 加 network_security_config
如果是自己开发的 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"
...>
注意:只在 debug 构建中启用,release 构建会降低安全性。
方案四:模拟器自带 Root
雷电、夜神、MuMu 等模拟器默认带 Root,直接用方案一移动证书到系统目录。
怎么确认问题是证书还是别的
在 Android 设备上:
- 打开 Chrome 浏览器 → 访问 HTTPS 网站(如 https://example.com)
- 看 Chrome 地址栏有没有锁
- Chrome 能正常打开但 ProxyPin 抓不到明文 → 证书没装好
- Chrome 也打不开(或警告不安全) → 证书没安装或没信任
- Chrome 能打开且 ProxyPin 浏览器请求有明文 → 证书没问题,但 App 有证书固定 → 需要额外绕过