解决Charles安装完证书抓不到包乱码问题
- 问题
- 解决方案
- 具体实践
- 方法一
- 方法二
- 方法三
- 注意
环境:android12(红米、已root)、MacOS
问题
Charles按照教程安装完证书,配置完SSL代理后开始抓包。
http的包抓取成功,https抓到的包都是乱码没有解析的。提示:Client SSL handshake failed: An unknown issue occurred processing the certificate(certificate_unknown)。
经过查询发现,安卓7.0及以上系统对于证书的安全策略做了修改,用户证书只能用于代理浏览器的流量,而应用是不会信任这些证书。
解决方案
1、将用户证书导入系统证书。
2、把app项目设置默认信任所有证书(系统+用户)。
这里直接使用方案一。
大致步骤是通过 adb root 和 adb remount 将用户证书直接复制进 /system/etc/security/cacerts/ 路径。
adb root #获取root权限
adb disable-verity #关闭检测功能
adb reboot #关闭检测之后需要重启机器
#重启机器成功之后:
adb root #再次获取root权限
adb remount #重启挂载system分区为可读写分区
adb shell
cp <cert>.0 /system/etc/security/cacerts/
或者
adb shell
su
mount -o remount, rw /system #挂载system分区为可读写分区
cp <cert> .0 /system/etc/security/cacerts/
具体实践
方法一
第一步 adb root 就出问题了。
adb root
尝试安装超级 adbd(adbd-insecure.apk)。
下载地址:https://forum.xda-developers.com/t/2014-11-10-root-adbd-insecure-v2-00.1687590/
安装完成后需要将Enable insecure adbd 和 Enable at boot 勾选上。
然而点击 Enable insecure adbd 选项框会报错。可能是安卓版本太高了的原因。
再尝试网上文章说的安装 magisk 模块 adb_root。
下载地址:https://github.com/evdenis/adb_root
根据步骤下载zip,adb push到手机后,在magisk上选择本地安装。安装成功后,重启手机。结果还是不行。
方法二
经过百度谷歌了很久后实在找不到方法了,放弃第一种方法,打算通过adb shell后再挂载分区。
挂载时报错:找不到 /system。
查询后发现原因是在Android8.0以上通过以上mount命令,你会发现找不到/system代表的节点和拥有的权限信息,这是因为Android8.0之后谷歌加入了A/B system的特性,system分区跟ramdisk分区打包在一起,因此系统起来之后也就不存在system分区了,而是直接把system镜像挂载到/根目录上。所以/proc/mounts文件中没有包含/system的权限信息。
需要使用
mount -o remount -o rw /
然而还是不行。
根据他的解释,当然上面方法不能挂载/system目录的话而且提示“’/dev/root’ is read-only”的话,那么是因为你的设备开启了avb,此时就只能通过下面的方式完全重新挂载整个系统:
adb root
adb disable-verity
adb remount
绕了一圈又回到了原点。
参考:
之后又尝试用 mt管理器和 fx管理器挂载,结果都没成功。
方法三
经过寻找在git上发现一种方法:通过Magisk模块,将文件放到/system目录下。
1、准备证书
Charles导出证书 Charles -> Help -> SSL Proxying -> save Charles root certificate
2、转换证书
为什么算了两个哈希值,好像是根据机型不同,需要用到的哈希算法不同。
# 获取文件名
openssl x509 -inform PEM -subject_hash_old -in charles-ssl-proxying-certificate.pem | head -1 #aaaaaaaa
openssl x509 -inform PEM -subject_hash -in charles-ssl-proxying-certificate.pem | head -1 #bbbbbbbb
# 分别使用上面的文件名,注意后缀
openssl x509 -inform PEM -text -in charles-ssl-proxying-certificate.pem > aaaaaaaa.0
openssl x509 -inform PEM -text -in charles-ssl-proxying-certificate.pem > bbbbbbbb.0
3、编辑输出的文件,把 -----BEGIN CERTIFICATE-----
到文·件结束这部分移动到文件首部
4、制作Magisk模块
模块文件结构为:
charles_ca
├── META-INF
│ └── com
│ └── google
│ └── android
│ ├── update-binary
│ └── updater-script
├── module.prop
└── system
└── etc
└── security
└── cacerts
├── aaaaaaaa.0
└── bbbbbbbb.0
下载项目,解压后把前面转换好的文件移动到 system/etc/security/cacerts 下面,替换 aaaaaaaa.0 和 bbbbbbbb.0。然后压缩成zip。
关于模块中的system目录,根据 https://topjohnwu.github.io/Magisk/guides.html#magisk-module-installer 上面的解释,/system路径下的文件可以添加到手机中相同路径下的文件夹内或者直接替换。
5、安装模块
adb push 将zip包推到手机里,magisk点击本地安装,成功后就可以抓包了。
注意
制作模块时遇到了一个坑,我把charles_ca文件夹直接压缩成zip。然后在magisk中安装的时候直接报错了。
然后我观察了一下其他模块的安装包,对比了自己的,发现压缩时应该直接把META-INF、module.prop、system三个文件压缩,不能外面加一个文件夹。
参考:https://github.com/DabanC/android_install_ca_certificate、https://www.jianshu.com/p/06ccefcdbcd2