安卓7.0及以上版本抓包https失败解决方法

知识的价值不在于占有,而在于使用。这篇文章主要讲述安卓7.0及以上版本抓包https失败解决方法相关的知识,希望能为你提供帮助。
【安卓7.0及以上版本抓包https失败解决方法】目录

  • 现象
  • 原因
  • 解决办法
  • webview抓包失败
  • 警告

现象
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=https://www.songbingjia.com/android/" 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(); } }







    推荐阅读