Ryan Shang

生死看淡,不服就干

0%

Android14设置Charles证书为系统根证书

一、背景

最近把自己手头的安卓测试机升级为安卓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包抓包。