Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式相关的知识,希望对你有一定的参考价值。

参考技术A

最近升级了 targetSdkVersion 到 28 后发现在 android 7.0 以上机型 Charles 抓取 https 包时显示找不到证书,但是 Android 6.0 机型还是可以正常抓包。原因是因为从 Android 7.0 开始,默认的网络安全性配置修改了,具体请阅读官方文档 网络安全性配置 。

Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:

而在 Android 7.0(API 24)到 Android 8.1(API 27)的默认网络安全性配置如下:

而在 Android 9.0(API 28)及更高版本的默认网络安全性配置如下:

对比很容易发现,在 Android 7.0(API 24)到 Android 8.1(API 27),默认不再信任用户添加的 CA 证书,所以也就不再信任 Charles 和 Fiddler 抓包工具的证书,所以抓取 HTTPS 包时才会失败。而且在 Android 9.0(API 28)及更高版本上,不仅默认只系统预装的 CA 证书,还默认禁止所有明文通信(不允许 http 请求)。

所以解决该问题就需要应用信任 Charles 和 Fiddler 抓包工具的证书抓包工具即可。

最简单的解决方式是使用 Android 6.0 以下的网络安全性配置:

添加 res/xml/network_security_config.xml :

然后在清单文件中指向该文件:

这种解决方式有一个安全风险:正式版的应用会有被他人抓包的风险。

如何只在调试模式下允许抓包呢?

使用 <debug-overrides> 即可实现只在 android:debuggable 为 true 时才生效的配置:

网上有些解决方式是将 Charles 和 Fiddler 的证书添加到 raw 文件夹下的方式也可以,但是繁琐了点。

在 Android 9.0(API 28)以上允许部分 http 请求

最佳的解决方式肯定是全部使用 https 请求,安全性更高,如果有些请求或测试环境下还是需要使用 http 请求,需要在网络安全性配置添加白名单:

以上是关于Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式的主要内容,如果未能解决你的问题,请参考以下文章

android 7.0以上charles https抓包

android 7.0以上charles https抓包

安卓7.0以上手机使用charles代理抓取https数据

charles——OpenSSL——安卓7.0以上https抓包

charles——OpenSSL——安卓7.0以上https抓包

Fiddler安卓7.0以上添加Fiddler/Charles证书到系统根证书(模拟器-雷电)