Android 7.0 (API 24)的应用不再信任用户或管理员添加的CA证书来进行安全连接,所以按照Charles问题之抓Android手机应用Https包,出现Unknown安装的CA证书抓取的内容依然为unknown,需要按照下面的方式将Charles证书写入Android手机的系统证书里
1. 获取手机root权限
这个是基础
不同Android手机,root方式不同,可以根据自己的手机型号百度root方式,一定要获取Android手机的root权限,才能接下来的操作
2. 获取手机system目录写权限
前提:确定电脑安装了adb,手机连接电脑
使用到的adb命令和执行结果实例:
adb root
adb disable-verity (最新的adb 工具包才支持adb disable-verity命令,如果是Linux开发环境,则可使用工程编译结果目录out/host/linux-x86/bin下的adb执行文件)
adb reboot 重启设备 (只要不刷机,以上步骤执行一次就行)
adb root
adb remount
如果电脑连接多台Android手机,需要访问指定设备:
adb devices (查询电脑当前连接的所有手机信息)
db -s 87807845 shell (87807845为某台手机的序列号,通过adb devices查询获取)
如上红框所示,remount成功后,现在可以对system目录进行读写了
这里可能遇到的问题:
-
adb disable-verity如果运行报如下错误, 是因为手机设备没有root导致
-
苹果电脑无法识别安卓手机,不能使用adb命令与安卓手机互传文件
极可能是因为:安卓手机没有打开USB调试,用数据线连接手机后,选择传输文件报错
按照如下2张图操作,点击【传输文件】后,即可使用adb命令与手机互传文件
注意:有些手机可能需要连续点击「关于手机」中的「版本号」多次才能开启「开发者选项」
- remount后仍提示system目录没有写权限,可以试试重启手机
3. 下载Charles证书并重命名
将Android手机连接Charles后,建议使用腾讯浏览器,访问 chls.pro/ssh 下载后缀是 .pem 的证书,腾讯浏览器下载的证书一般在如下目录可以找到:/sdcard/Android/data/com.tencent.mtt/files
下载证书后,可以拷贝到电脑上,然后执行hash命令,具体操作示例和结果如下:
adb pull /sdcard/Android/data/com.tencent.mtt/files/charles-proxy-ssl-proxying-certificate.pem /Users/hanyuxia/Documents (拷贝到电脑)
cd /Users/hanyuxia/Documents
openssl x509 -subject_hash_old -in charles-proxy-ssl-proxying-certificate.pem
然后将证书名称重命名为hash 值 ,其中的每个证书的命名规则如下:
<Certificate_Hash>.<Number>
证书重命名后实例为:6d8363ce.0
文件名是一个Hash值,而后缀是一个数字(注意:后缀数字先用0,后缀名的数字是为了防止文件名冲突的,比如如果两个证书算出的Hash值是一样的话,那么一个证书的后缀名数字可以设置成0,而另一个证书的后缀名数字可以设置成1)
文件名用下面的命令计算出来:
openssl x509 -subject_hash_old -in <Certificate_File>
4. 将Charles证书写入手机系统证书
手机系统证书目录: /system/etc/security/cacerts/
- 方法一:使用adb命令拷贝
adb push /Users/hanyuxia/Documents/6d8363ce.0 //system/etc/security/cacerts/
拷贝成功后,可以在手机目录 设置->密码与安全->系统安全->加密与凭据->信任的凭据 的系统标签页看到刚刚加入的与你的电脑对应的Charles证书,然后将其启用,就可以顺利抓取https的包了,不同手机系统证书的路径可能略有区别,但是一定在 ~->系统安全->加密与凭据->信任的凭据,前面的路径具体手机具体看
注意:证书区分电脑,同一台手机连接不同的电脑抓包,都需要在手机上安装与之相对应的Charles证书
-
方法二:
使用手机ES文件浏览器将证书移至到/system/etc/security/cacerts -
方法三:
另一个选择: RE文件管理器(ES文件浏览器可能要收费)