7.0以上系統Charles無法抓取https接口的解決方案

現象

    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接口數據了。

     

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章