現象
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 /system
就可以正常複製文件了,複製好後將文件權限更改爲644,並重啓設備,之後就可以抓https接口數據了。