乐趣区

安卓70及以上版本抓包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 里的 <application> 标签中,添加如下代码:

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();}
}
退出移动版