26 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇

1.简介众所周知,假如设备是android 7.0+的系统同时应用设置targetSdkVersion >= 24的话 , 那么应用默认是不信任安装的Fiddler用户证书的,所以你就没法抓到应用发起的https请求,然后你在Fiddler就会看到一堆200 HTTP Tunnel to xxx.xxx.xxx:443的请求日志,这些都是没有成功抓取的https请求,下面重点介绍一下各种解决方案,相信总有一款解决方案适合你~
在抓包测试中 , 相信很多人都遇到过 Android 高版本(Android7.0 以上)系统无法抓包的问题 。
由于在测试过程中对分析定位问题很不方便,所以就想找开发的同学帮忙,结果开发也说搞不定,那只能自己解决了 。
2.现象Android6.0 及以下系统手机可以抓取https包,而 Android7.0 及以上系统手机不能抓取https包(安装了https证书也不行) 。
3.原因Android7.0+ 的版本新增了证书验证(系统证书),所以 App 内不再像原来一样默认信任用户的证书 。
谷歌在安卓7.0修改了安全策略,安卓系统大于7.0时,应用不在信任用户安装的证书文件 。用户添加的 CA 证书不能再用于安全连接,对于 https 传输的数据就抓取不到了 。
Android 7.0+的版本不能抓包 , 缘由Android 更新了网络的安全性配置api >24 , 默认不信任用户导入的CA证书 , 所以需要配置文件,来信任用户导入的证书 。
官方说明文档:https://developer.android.google.cn/training/articles/security-config.html
By default, secure connections (using protocols like TLS and HTTPS) from all apps trust the pre-installed system CAs, and apps targeting Android 6.0 (API level 23) and lower also trust the user-added CA store by default.
果然,在Android 6.0 (API level 23)及以前,APP默认信任系统自带的CA证书以及用于导入的CA证书,Android 6.0 (API level 23)以后,APP默认只信任系统自带的CA证书,对于用户导入的不予理会 。
也就是说,关于 [network-security-config],在Android 6.0 (API level 23)及以前默认是这样的:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="http://img.zhejianglong.com/231017/1IH1C14-0.jpg" /><certificates src="http://img.zhejianglong.com/231017/1IH11410-1.jpg" /></trust-anchors></base-config>Android 7.0 (API level 24) 及以后是这样的:
<base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="http://img.zhejianglong.com/231017/1IH1C14-0.jpg" /></trust-anchors></base-config>同时在上面的链接中,Google也给出了办法 , 怎么在Android7.0及以后的系统中,让APP信任我们手工导入的CA证书 。就是宏哥在后边的5.3小节中介绍的内容 。
4.Android 版本越高,HTTPS 报文越难抓在Android 安装证书,宏哥觉得这个步骤意义不大,根本原因在于:用户自己安装的 CA 证书没有 ROOT 权限 。
我们先看一张图 , 这个是 Android 的证书信任页面:

26 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇

文章插图
从上图可以看出,Android 系统把证书信任分为两大块:
  • 系统 CA 证书:基本拥有所有权限
  • 用户 CA 证书:用户自行安装,权限很低
我们自己安装的 Charles 证书都属于用户 CA 证书 。除了证书的权限问题,Android 的不同版本对权限的处理规则也不一样:
【26 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇】:Android 7.0 以下:信任用户 CA 证书,可以简单的理解为我们安装的证书直接获得 ROOT 权限
:Android 7.0 以上,targetSdkVersion < 24:信任用户 CA 证书
:Android 7.0 以上,targetSdkVersion >= 24:不信任用户 CA 证书
通过以上的分析 , 我们可以得出几个让 Android 信任 Fiddler 证书的方案:
1.ROOT
直接 ROOT Android 手机,把 Fiddler证书放到系统证书里,实现证书洗白 。
2.准备一个低于 Android 7.0 的手机
Android 7.0 是 2016 年的系统,按照 Android 手机两年一换代一年一更新的速度算,这种手机很难找到了 。
3.准备一个 targetSdkVersion < 24 的 APP 安装包
Google Play Store要求今年 8 月之后上线、11 月之后更新的 App 必须升级到 Target API 28,升级说明网址:https://docs.msdk.qq.com/v5/zh-CN/FAQS/fe2df04a168059a153dcd0f18f75d789/b801ba90b273389d8e588d46343efb37.html。没有办法老大说话了,国内各大应用市场手机APP纷纷响应号召在2019 年统一要求 APP API 版本必须大于 28,这种安装包很难找到了 , 而且互联网产品迭代这么快 , 不一定能保证安装包可用 。

推荐阅读