Skip to content
On this page

Android 7 及以上安装 Ca 证书到系统级凭证目录

在 Android 7 以后,系统和 APP 不在信用用户级别的证书凭证,导致明明安装了 Charles、Fiddler 等中间人证书还是出现了无法正常抓包的情况。

准备工作

  • 一台已经 root 的手机(本文使用的是 Pixel 5)
  • Openssl 工具
  • Charles (不限于其他工具)

证书生成

在 Charles 顶部工具栏依次选择 Help -> SSL Proxying > Save Charles Root Certificate 导出到指定目录,

获取证书哈希值

使用 openssl 工具的 x509 指令获取 pme 证书的 hash 值

1. 证书转换(如果导出的是 .cer 格式需要执行此命令,如果已经是 .pme 则不执行)
$ openssl x509 -inform DER in charles.cer -out charles.pem

2. 获取 hash 值
# openssl 版本在 1.0 以上执行这行代码
$ openssl x509 -inform PEM -subject_hash_old -in charles.pem

# openssl 版本在 1.0 以下执行这行代码
$ openssl x509 -inform PEM -subject_hash -in charles.pem

使用 openssl version 可以查看当前 openssl 的版本

将证书复制后重命名

执行上述获取 hash 值的代码后,把输入内容往上滚动,则可以看到 900f8e2a 这样的一行内容,这个就是证书的 hash 值。

接下来对证书文件进行复制并重命名

$ cp charles.pem 900f8e2a.0

900f8e2a.0 中最后的 0 代表证书的版本,可以是其他1、2、3等,说白了就是为了防止文件名冲突。

将证书放置系统级目录中

Android 13 直接使用 MoveCertificate 模块。

以下先忽略。

先将证书从电脑中通过 adb push 命令推送到 /data/local/tmp 目录下,

$ adb push 900f8e2a.0 /data/local/tmp

进入 /data/local/tmp 将 证书文件复制到系统级目录

$ cp 900f8e2a.0 /system/etc/security/cacerts/

不出意外的会给出以下错误

cp: /system/etc/security/cacerts//900f8e2a.0: Read-only file system

Released under the MIT License.