前言

安卓7.0以后,安卓不信任用户安装的证书,所以抓https时无法解码请求,对于第三方应用,网上解决方法较多,比如使用安卓模拟器(兼容性差,很多应用闪退),使用xposed框架,将证书注入apk包等,这里使用给安卓手机添加系统证书。

注:需要手机有root权限(root手机可以参考Pixel3刷机Android9并Root

导出证书

这里以Charles为例,help > SSL Proxying > Save Charles Root Certificate

生成证书

安卓手机系统证书存储在**/system/etc/security/cacerts**

文件名格式为**<证书Hash值>.编号**,如xxxxxxxx.0(hash值已经存在则编号依次+1)

计算上面导出的证书的hash值,示证书格式选命令

1
2
#openssl x509 -inform DER -subject_hash_old -in 证书文件.cer # cer格式证书
openssl x509 -inform PEM -subject_hash_old -in 证书文件.pem # pem格式证书

计算结果如下:

1a8d77bf则为证书hash值,再去/system/etc/security/cacerts看已存在的证书的hash值,确定编号,一般都不会重复

生成安卓系统预设格式证书文件,示证书格式选命令

1
2
#openssl x509 -inform DER -text -in 证书文件.cer > 1a8d77bf.0 # cer格式证书
openssl x509 -inform PEM -text -in 证书文件.pem > 1a8d77bf.0 # pem格式证书

最后编辑一下输出的文件,把 —–BEGIN CERTIFICATE—–—–END CERTIFICATE—– 这部分移到文件开头

结果如下

上传证书

这里假定证书文件名1a8d77bf.0

1
2
3
4
5
6
7
adb push 1a8d77bf.0 /sdcard  # 把证书上传到手机sd卡
adb shell # adb进入手机shell交互
su # 切换root用户
mount -o rw,remount / # 系统挂载为可读写
cp /sdcard/xxxxxxxx.0 /system/etc/security/cacerts/ # 把sd卡中的证书拷贝到系统证书目录下
chmod 644 /system/etc/security/cacerts/1a8d77bf.0 # 修改证书权限
mount -o ro,remount / # 系统恢复挂载为只读

注:系统目录挂载为可读写本人只在android9系统中测试成功,貌似android10以后比较麻烦,可自行查找方法

最后

最后重启手机,就可以正常抓https数据包了。
到手机 设置->安全->信任凭据–>系统 可以查看到安装的证书