现象
Android 7.0及以上系统在即使安装过证书的情况下,抓取https接口会出现:Client SSL handshake failed: An unknown issue occurred processing the certificate (certificate_unknown)问题,证书无效,导致https接口数据抓取失败问题。
原因
在Android7.0及以上的系统中,每个应用可以定义自己的可信CA证书集。但默认情况下,应用只会信任系统预装的CA证书,而不会信任用户安装的CA证书。通过Charles安装的证书恰恰正属于用户安装的CA证书,因此会被视作不安全的证书。导致出现上面的证书不可信问题
解决方法
如果只抓取自己项目APP的https接口,可以在项目中添加自定义CA配置,允许用户安装的CA证书可信:
1、在res/xml目录下新建network_security_config.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<debug-overrides cleartextTrafficPermitted="true">
<trust-anchors>
<!--信任所有的系统证书-->
<certificates src="system" />
<!--信任所有用户安装的证书-->
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
2、在manifest.xml的application标签中添加如下配置:
android:networkSecurityConfig="@xml/network_security_config"
3、正常安装charles证书,连接代理即可。
如果需要抓取其它APP的https接口(手机需要Root):
这个方式的原理是把用户安装的证书复制到手机的系统证书目录下,当成系统证书来用,所以:
需要手机Root!
需要手机Root!
需要手机Root!
1、手机root。
2、找到手机上下载的charles证书,导出到PC上并获取此证书的Hash值:
打开命令行工具,执行命令:
openssl x509 -subject_hash_old -in 证书路径
3、将证书文件重命名为 hash值.0的格式,如: 1c20342s.0。(注意不要带后缀名)。
4、将重命名好的证书通过adb push
到/sdcard/Download
,然后将其复制到/system/etc/security/cacerts/。
如果出现了 Read-only file system的错误
,说明系统文件夹是只读的,无法修改,执行以下操作将系统文件挂载为可读写:
adb root remount
adb shell
su
mount -o rw,remount /
就可以正常复制文件了,复制好后将文件权限更改为644,并重启设备,之后就可以抓https接口数据了。