1. 程式人生 > 實用技巧 >徹底解決安卓7.0及以上版本抓包https失敗

徹底解決安卓7.0及以上版本抓包https失敗

目錄

現象

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

原因

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

解決辦法

前提:在手機端和電腦端都必須安裝https的安全證書

配置:打測試包時,專案設定預設信任所有證書(系統+使用者)

1.在工程res-xml目錄中建立一個名為 network_security_config.xml的檔案,檔案內容如下:

<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中,將一行程式碼給註釋掉:

super.onReceivedSslError(view, handler, error)

這樣是為了忽略掉SSL證書錯誤,因為開啟代理後網路會變得不安全,證書會報錯誤,webview檢測到證書錯誤之後就不請求任何資料。 註釋是為了忽略掉父類的處理,預設執行下去。

警告

這樣的配置操作是敏感且危險的,只能用於測試環境方便抓包,線上包一定注意要恢復配置。

後記

通過查詢資料,還有一個方法,通過過載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();
}
}