Android 7.0 以上 Charles 和 Fiddler 無法抓取 HTTPS 包的解決方式

最近升級了 targetSdkVersion 到 28 后發(fā)現(xiàn)在 Android 7.0 以上機型 Charles 抓取 https 包時顯示找不到證書,但是 Android 6.0 機型還是可以正常抓包。原因是因為從 Android 7.0 開始,默認的網(wǎng)絡(luò)安全性配置修改了,具體請閱讀官方文檔網(wǎng)絡(luò)安全性配置。

問題原因

Android 6.0(API 23)及更低版本應(yīng)用的默認網(wǎng)絡(luò)安全性配置如下:

<!-- 默認允許所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <!-- 信任系統(tǒng)預(yù)裝 CA 證書 -->
        <certificates src="system" />
        <!-- 信任用戶添加的 CA 證書,Charles 和 Fiddler 抓包工具安裝的證書屬于此類 -->
        <certificates src="user" />
    </trust-anchors>
</base-config>

而在 Android 7.0(API 24)到 Android 8.1(API 27)的默認網(wǎng)絡(luò)安全性配置如下:

<!-- 默認允許所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
    <trust-anchors>
        <!-- 信任系統(tǒng)預(yù)裝 CA 證書 -->
        <certificates src="system" />
    </trust-anchors>
</base-config>

而在 Android 9.0(API 28)及更高版本的默認網(wǎng)絡(luò)安全性配置如下:

<!-- 默認禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false">
    <trust-anchors>
        <!-- 信任系統(tǒng)預(yù)裝 CA 證書 -->
        <certificates src="system" />
    </trust-anchors>
</base-config>

對比很容易發(fā)現(xiàn),在 Android 7.0(API 24)到 Android 8.1(API 27),默認不再信任用戶添加的 CA 證書,所以也就不再信任 Charles 和 Fiddler 抓包工具的證書,所以抓取 HTTPS 包時才會失敗。而且在 Android 9.0(API 28)及更高版本上,不僅默認只系統(tǒng)預(yù)裝的 CA 證書,還默認禁止所有明文通信(不允許 http 請求)。

解決方式

所以解決該問題就需要應(yīng)用信任 Charles 和 Fiddler 抓包工具的證書抓包工具即可。

最簡單的解決方式是使用 Android 6.0 以下的網(wǎng)絡(luò)安全性配置:

添加res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

然后在清單文件中指向該文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest>

這種解決方式有一個安全風(fēng)險:正式版的應(yīng)用會有被他人抓包的風(fēng)險。

如何只在調(diào)試模式下允許抓包呢?

使用<debug-overrides>即可實現(xiàn)只在android:debuggabletrue時才生效的配置:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 支持 Android 7.0 以上調(diào)試時,信任 Charles 和 Fiddler 等用戶信任的證書 -->
    <debug-overrides>
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

網(wǎng)上有些解決方式是將 Charles 和 Fiddler 的證書添加到raw文件夾下的方式也可以,但是繁瑣了點。

在 Android 9.0(API 28)以上允許部分 http 請求

最佳的解決方式肯定是全部使用 https 請求,安全性更高,如果有些請求或測試環(huán)境下還是需要使用 http 請求,需要在網(wǎng)絡(luò)安全性配置添加白名單:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <!-- 支持 Android 9.0 以上使用部分域名時使用 http -->
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">sample.domain</domain>
    </domain-config>
    <!-- 支持 Android 7.0 以上調(diào)試時,信任 Charles 和 Fiddler 等用戶信任的證書 -->
    <debug-overrides>
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容