于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式相关的知识,希望能为你提供帮助。
android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式
https://johnnyshieh.me/posts/android-7-capture-https-package/
发表于 2019-05-06 | 分类于 Android | 0 | 阅读次数
最近升级了 targetSdkVersion 到 28 后发现在 Android 7.0 以上机型 Charles 抓取 https 包时显示找不到证书,但是 Android 6.0 机型还是可以正常抓包。原因是因为从 Android 7.0 开始,默认的网络安全性配置修改了,具体请阅读官方文档网络安全性配置。
问题原因Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:
1
2
3
4
5
6
7
8
9
< !-- 默认允许所有明文通信 -->
< base-config cleartextTrafficPermitted=" true" >
< trust-anchors>
< !-- 信任系统预装 CA 证书 -->
【Android 7.0 以上 Charles 和 Fiddler 无法抓取 HTTPS 包的解决方式】< certificates src=https://www.songbingjia.com/android/" system" />
< !-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
< certificates src=https://www.songbingjia.com/android/" user" />
< /trust-anchors>
< /base-config>
而在 Android 7.0(API 24)到 Android 8.1(API 27)的默认网络安全性配置如下:
1
2
3
4
5
6
7
< !-- 默认允许所有明文通信 -->
< base-config cleartextTrafficPermitted=" true" >
< trust-anchors>
< !-- 信任系统预装 CA 证书 -->
< certificates src=https://www.songbingjia.com/android/" system" />
< /trust-anchors>
< /base-config>
而在 Android 9.0(API 28)及更高版本的默认网络安全性配置如下:
1
2
3
4
5
6
7
< !-- 默认禁止所有明文通信 -->
< base-config cleartextTrafficPermitted=" false" >
< trust-anchors>
< !-- 信任系统预装 CA 证书 -->
< certificates src=https://www.songbingjia.com/android/" system" />
< /trust-anchors>
< /base-config>
对比很容易发现,在 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
:1
2
3
4
5
6
7
8
9
< ?xml version=" 1.0" encoding=" utf-8" ?>
< network-security-config>
< base-config cleartextTrafficPermitted=" true" >
< trust-anchors>
< certificates src=https://www.songbingjia.com/android/" system" />
< certificates src=https://www.songbingjia.com/android/" user" />
< /trust-anchors>
< /base-config>
< /network-security-config>
然后在清单文件中指向该文件:
1
2
3
4
5
6
7
< ?xml version=" 1.0" encoding=" utf-8" ?>
< manifest ... >
< application android:networkSecurityConfig=" @xml/network_security_config"
... >
...
< /application>
< /manifest>
这种解决方式有一个安全风险:正式版的应用会有被他人抓包的风险。
如何只在调试模式下允许抓包呢?
使用
<
debug-overrides>
即可实现只在android:debuggable
为true
时才生效的配置:1
2
3
4
5
6
7
8
9
10
< ?xml version=" 1.0" encoding=" utf-8" ?>
< network-security-config>
< !-- 支持 Android 7.0 以上调试时,信任 Charles 和 Fiddler 等用户信任的证书 -->
< debug-overrides>
< trust-anchors>
< certificates src=https://www.songbingjia.com/android/" system" />
< certificates src=https://www.songbingjia.com/android/" user" />
< /trust-anchors>
< /debug-overrides>
< /network-security-config>
网上有些解决方式是将 Charles 和 Fiddler 的证书添加到
raw
文件夹下的方式也可以,但是繁琐了点。在 Android 9.0(API 28)以上允许部分 http 请求
最佳的解决方式肯定是全部使用 https 请求,安全性更高,如果有些请求或测试环境下还是需要使用 http 请求,需要在网络安全性配置添加白名单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
< ?xml version=" 1.0" encoding=" utf-8" ?>
< network-security-config>
< !-- 支持 Android 9.0 以上使用部分域名时使用 http -->
< domain-config cleartextTrafficPermitted=" true" >
< domain includeSubdomains=" true" > sample.domain< /domain>
< /domain-config>
< !-- 支持 Android 7.0 以上调试时,信任 Charles 和 Fiddler 等用户信任的证书 -->
< debug-overrides>
< trust-anchors>
< certificates src=https://www.songbingjia.com/android/" system" />
< certificates src=https://www.songbingjia.com/android/" user" />
< /trust-anchors>
< /debug-overrides>
< /network-security-config>
推荐阅读
- SpringMVC框架-使用注解编写的处理请求和映射-@Controller@RequestMapping
- 关于uniapp版本的问题
- UIautomator2 安卓自动化教程
- Android/Unity大乱斗-完整双方集成交互指南
- Android开发之sd卡存储和机身存储的路径获取
- 升级code11.3后遇到React Native启动报错的问题 getCurrentAppState:error 和 objectAtIndexedSubscript: 的解决方案
- 如何在mumu模拟器上联调app并且用Charles抓包
- 1.Android6.0运行时权限简介_2.Android6.0权限适配之WRITE_EXTERNAL_STORAGE(SD卡写入)3_.Android 6.0 运行时权限理解
- Android学习进度一