安卓7.0及以上版本,系统只会信任预装CA证书,用户手动安装的证书,仅浏览器可以识别,各类App不会认可。想要抓包工具或者自签证书在全部应用生效,需要把证书导入系统信任目录,这个操作前提是获取root权限,没有root无法修改系统目录。
前期准备几项工作。手机已经完成root,Magisk、KernelSU、APatch任意一种方案都可以。电脑安装ADB和OpenSSL,两个工具分别负责文件传输和哈希值计算。在抓包工具导出根证书,Charles在Help菜单找到SSL Proxying,点击Install Charles Root Certificate,选定保存路径,导出.cer或者.pem证书文件。

手动操作核心分为三步:转换重命名、推送文件、重启设备。
第一步转换证书格式。抓包工具导出证书可能是DER编码,安卓系统识别PEM格式。电脑终端执行 openssl x509 -inform DER -in charles-ssl-proxying-certificate.cer -outform PEM -out charles.pem,把二进制格式转为文本PEM。接着执行 openssl x509 -inform PEM -subject_hash_old -in charles.pem,计算哈希值,终端输出八位十六进制字符,就是证书在系统内的标识。复制pem文件,重命名为哈希值加上.0后缀,示例:a1b2c3d4.0。
下一步推送文件到手机。执行adb push a1b2c3d4.0 /sdcard/传到手机公共存储目录,之后进入shell获取root权限。adb shell之后输入su,命令提示符变成#,代表root权限获取成功。接下来把文件移动到 /system/etc/security/cacerts/目录。安卓10之后system分区默认只读,直接执行cp命令会提示Read-only file system。很多新机型执行mount -o rw,remount /无法重新挂载分区。可行替代方案是挂载tmpfs内存文件系统覆盖证书目录,先把目录原有证书复制到临时位置,执行mount -t tmpfs tmpfs /system/etc/security/cacerts,把原有证书移回目录,再放入自己的证书。这个方式不会改动system分区本身,重启之后自动复原,缺点是每次重启都要重新执行脚本。手机安装Magisk的话,写开机脚本自动完成挂载和复制会省事很多。
证书放入目录不等于完成,权限配置不能出错。执行chmod 644 /system/etc/security/cacerts/你的哈希值.0设置权限644,chown root:root将文件归属改为root用户,再执行chcon u:object_r:system_file:s0添加SELinux标签。三项配置缺一不可,权限异常的话,设置页面不会显示这张证书。全部操作完成执行adb reboot重启手机。开机之后打开设置搜索信任的凭据或者加密与凭据,切换到系统分类,就能看到导入的证书。
不想手动敲命令,Magisk模块是更稳妥的选择。MoveCertificate模块专门用来把用户证书迁移进系统证书区,支持Android7到16。使用方法简单,先在手机设置正常安装证书,打开Magisk,从存储安装MoveCertificate的zip包,重启手机即可。模块自动处理格式转换、哈希重命名,不需要操作命令行。Cert-Fixer功能相近,更加轻量化,安装模块之后,用户区安装的CA证书会自动复制进系统目录。
Android14改动很大,系统证书存放路径从 /system/etc/security/cacerts/ 变更到 /apex/com.android.conscrypt/cacerts/,apex属于只读模块化分区,就算root权限也不能直接写入文件。adb shell查看,该目录只读挂载,执行mount命令提示没有剩余空间。解决办法是操作 /system/etc/security/cacerts/,Android14依旧保留这个路径,只是系统读取证书优先读取apex目录。可行方案是对两个路径同时挂载tmpfs,mount -t tmpfs tmpfs /apex/com.android.conscrypt/cacerts,复制证书进去,同时处理 /system/etc/security/cacerts目录。重启挂载失效,需要重新执行脚本,所以Android14导入证书,一般搭配开机自启脚本或者Magisk模块。
验证证书是否生效,重启之后打开设置系统凭据列表,确认证书出现在系统分类。也可以执行adb shell ls -l /system/etc/security/cacerts/ | grep 你的哈希值,文件存在且权限644代表配置成功。列表找不到证书,优先检查文件名是否严格为哈希值.0格式,核对权限和SELinux标签。证书过期或者格式转换错误,同样会失效,导出证书时确认使用PEM编码。
有一个坑需要提前留意,安卓11之后大量银行、金融类App会扫描系统证书列表,检测到非官方CA证书就直接拒绝启动。如果只是临时抓包调试,使用完毕删除证书文件,重启手机恢复原状。长期保留证书,这类App会无法打开,安装前要清楚这个风险。