安卓7.0及以上版本抓包https失敗解決方法

現象

android7.0以上的手機https抓包失敗(安裝了https證書也不行)java

緣由

android7.0+的版本新增了證書驗證(系統證書)android

解決辦法

前提:在手機端和電腦端都必須安裝https的安全證書
配置:打測試包時,項目設置默認信任全部證書(系統+用戶)
1.在工程res-xml目錄中建立一個名爲 network_security_config.xml的文件,文件內容以下:web

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" />
            <certificates src="user" overridePins="true" />
        </trust-anchors>
    </base-config>
</network-security-config>

2.在AndroidManifest裏的 標籤中,添加以下代碼: 安全

android:networkSecurityConfig="@xml/network_security_config"

從新打包項目,而後抓包,便可成功。網絡

webview抓包失敗

上面能夠解決android原生抓包問題,但在android7.0以上的手機,開着網絡代理訪問不了webview,若要抓包webview,
須要在webview的WebViewClient中,將一行代碼給註釋掉:app

super.onReceivedSslError(view, handler, error)

這樣是爲了忽略掉SSL證書錯誤,由於開啓代理後網絡會變得不安全,證書會報錯誤,webview檢測到證書錯誤以後就不請求任何數據。 註釋是爲了忽略掉父類的處理,默認執行下去。ide

警告

這樣的配置操做是敏感且危險的,只能用於測試環境方便抓包,線上包必定注意要恢復配置。
後記
經過查找資料,還有一個方法,經過重載WebViewClient的onReceivedSslError()函數並在其中執行handler.proceed(),便可忽略SSL證書錯誤,繼續加載頁面,代碼以下:函數

WebView webview = (WebView) findViewById(R.id.webview);
webview.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // 不要調用super.onReceivedSslError,由於其包含了一條 handler.cancel(),第一次訪問時沒法加載,第二次之後能夠加載
        // super.onReceivedSslError(view, handler, error);
        // 忽略SSL證書錯誤,繼續加載頁面
        handler.proceed();
    }
}
相關文章
相關標籤/搜索