现象
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();}
}