一、背景
最近把自己手头的安卓测试机升级为安卓14体验新特性时,发现无法使用Charles抓包。
之前为了方便测试,在手机上把Charles的证书设置为系统证书,这样可以直接使用线上正式包来进行抓包调试H5页面,不需要反复收集不同APP最新的集成测试包。
大致流程参考:移动端开发调试工具——Charles
上网查看资料,安卓14对系统证书的逻辑进行了调整,将系统根CA证书,从系统目录/system/etc/security/cacerts
迁移到com.android.conscrypt.apex
(可通过Google Play动态更新)中,apex的挂载后的目录/apex/com.android.conscrypt/cacerts
。之前在/system/etc/security/cacerts
中添加的证书就不起作用了。
参考资料:原因
参考代码:核心改动
二、解决方案
1. 解决思路
在原来基于Magisk(root工具)一些模块修改/system/etc/security/cacerts
方案的基础上,可以在magisk模块的post-fs-data.sh增加一部操作即可解决问题。
1 | mount -o bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts |
所以不再进行手动复制计算证书hash值,重命名后复制到/system/etc/security/cacerts
的操作,直接使用现成的Magisk模块。
2. 解决方案
- 手机需要root
- 手机正常下载Charles的证书
- 使用系统设置正常安装用户证书(设置-> 安全 -> 加密与凭据 -> 安装证书 -> CA证书)
- 在Magisk(root工具)中安装Conscrypt Trust User Certs模块
- 重启设备
Note:安装成功后在设置中查看系统证书可能白瓶不显示,但是在/apex/com.android.conscrypt/cacerts
目录中可以显示(显示为hash.0名称),可以正常使用。
三、Android抓包知识点
顺便整理下Android抓包的几个知识点
1. 不同证书差异
(1) 用户证书
用户证书位于/data/misc/user/0/cacerts
目录,用户目录不需要额外权限即可更改,可直接通过设置(设置-> 安全 -> 加密与凭据 -> 安装证书 -> CA证书)安装。
(2) 系统证书(>=Android7.0, < Android14.0)
系统证书位于/system/etc/security/cacerts
目录,系统目录需要权限解锁system分区才可修改,需要对设备获取root权限后才能进行写入。
2. Android APP构建差异
(1) Release包
Android APP的构建中,配置签名信息后可生成Release包,Release包默认只信任系统证书。
(2) Debug包
Android APP的构建中,选择debug编译方式可生成Debug包,Debug包默认信任系统证书和用户证书。
3. 不同Android版本差异
(1) Android7.0
从Android7.0开始,系统不再信任用户CA证书(应用targetSdkVersion>= 24时生效,如果targetSdkVersion<24即使系统是 7.0+依然会信任)。即使安装了用户CA证书,在Android7.0+的设备上,targetSdkVersion>=24的正式包应用就无法抓取https请求的数据包。
(2) Android14.0
如背景中的描述,从Android14.0开始将系统根CA证书,从系统目录/system/etc/security/cacerts
迁移到com.android.conscrypt.apex
(可通过Google Play动态更新)中,apex的挂载后的目录/apex/com.android.conscrypt/cacerts
。并且,/apex
目录下不可挂载读写。无法直接通过root权限对其进行直接写入操作。
四、Android抓包场景总结
1. Debug包
下载证书后,使用系统设置正常安装用户证书即可(设置-> 安全 -> 加密与凭据 -> 安装证书 -> CA证书)
2. Release包(root)
(1) 系统版本>=Android7.0, < Android14.0
把下载的证书转移到PC/Mac上,使用
openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate.pem
计算特征值,例如46f58a05把证书文件改名为
46f58a05.0
把证书放到手机的系统分区中
/system/etc/security/cacerts/
(2) 系统版本>=Android14.0
- 手机正常下载Charles的证书
- 使用系统设置正常安装用户证书(设置-> 安全 -> 加密与凭据 -> 安装证书 -> CA证书)
- 在Magisk(root工具)中安装Conscrypt Trust User Certs模块
- 重启设备
3. Release包(非root)
需要Android开发人员在APP的Release包中配置特定的证书,然后在Charles中安装已配置的特定根证书,在手机中安装已配置的特定设备证书,这样可能实现针对Release包抓包。