《吐血整理》高级系列教程-吃透Fiddler抓包教程(26)-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="system" /> <certificates src="user" /> </trust-anchors> </base-config>
Android 7.0 (API level 24) 及以后是这样的:
<base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> </base-config>
同时在上面的链接中,Google也给出了办法,怎么在Android7.0及以后的系统中,让APP信任我们手工导入的CA证书。就是宏哥在后边的5.3小节中介绍的内容。
4.Android 版本越高,HTTPS 报文越难抓
在Android 安装证书,宏哥觉得这个步骤意义不大,根本原因在于:用户自己安装的 CA 证书没有 ROOT 权限。
我们先看一张图,这个是 Android 的证书信任页面:
从上图可以看出,Android 系统把证书信任分为两大块:
- 系统 CA 证书:基本拥有所有权限
- 用户 CA 证书:用户自行安装,权限很低
我们自己安装的 Charles 证书都属于用户 CA 证书。除了证书的权限问题,Android 的不同版本对权限的处理规则也不一样:
: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,这种安装包很难找到了,而且互联网产品迭代这么快,不一定能保证安装包可用。
4.骚操作
正常大道走不通,Android 小道还是有很多的。社区上有各种轮子可以绕开限制,但和 Fiddler 关系不大,宏哥就不展开说了。喜欢折腾的同学可以研究一下。
5.快速解决法
我们既然已经清楚了抓不到包的原因和罪魁祸首了,针对其进行解决即可。
5.1使用低与7.0版本安卓系统
用android 7.0以下系统的设备去装应用,是可以正常抓包,但是一般来说,android 7.0以下不管是真机还是模拟器,运行起来都是比较卡的,能接受不那么流畅体验的用户可以尝试,适合小白型用户使用。
找一个低于 7.0 版本的 Android 设备或者模拟器,即可解决。但是考虑到:治标不治本,公司本身就没有这样的设备,再加上找了几个模拟器,都是 Android7.0 版本的,所以此方案,直接选择放弃。
然后只好再去找开发,开发研究了半天,结果过来告诉我,我的iOS是可以抓包的啊,Android 的就不知道了,一瞬间我都有点想掀桌子了…
5.2targetSdkVersion设置为23
把应用apk的targetSdkVersion设置为23及以下,也是可以正常抓包,但是假如是抓别人的应用,同时别人又做了防止反编译措施的话,这个方案就不适用了。
5.3设置信任用户证书
设置信任用户证书,也就是自定义可信的CA,这个也是官方网址:https://developer.android.google.cn/training/articles/security-config 给出的解决方案。具体操作步骤如下:
1.在源码res目录下新建xml目录,增加network_security_config.xml文件(工程名/app/src/main/res/xml/network_security_config.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>
说明:certificates说明的src=“system"表示信任系统的CA证书,src=“user"表示信任用户导入的CA证书
2.修改项目的AndroidManifest.xml文件,在application中增加android:networkSecurityConfig="@xml/network_security_config"
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
说明:android:networkSecurityConfig的值指向的就是上一步创建的xml文件
3.然后然后重新编译再打包安装apk即可抓包!前提手机已经要安装了fiddler等CA证书哈!!!
这个方案也是仅适用于有android基础同时懂反编译的人员使用。这对开发童鞋来说,也很方便。但是,因为测试的是企业微信小程序,想让企业微信的开发人员帮我这么干,简直是白日做梦,更不用说安全等问题…
6.webview抓包失败
上面可以解决android原生抓包问题,但在android7.0以上的手机,开着网络代理访问不了webview,若要抓包webview,需要在webview的WebViewClient中,将一行代码给注释掉:
super.onReceivedSslError(view, handler, error)
这样是为了忽略掉SSL证书错误,因为开启代理后网络会变得不安全,证书会报错误,webview检测到证书错误之后就不请求任何数据。 注释是为了忽略掉父类的处理,默认执行下去。
6.1警告
这样的配置操作是敏感且危险的,只能用于测试环境方便抓包,线上包一定注意要恢复配置。
6.2拓展
通过查找资料,还有一个方法,通过重载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();
}
}
7.小结
Android证书分为“用户证书”和“系统证书”两种,在设置->安全->"查看安全证书"列表中,可以看到“系统”和“用户”两个列表。用户通过浏览器下载安装或者通过WLAN高级设置安装的证书均为用户证书。
关于证书的两个注意事项
(1)安装用户证书必须要设置开机密码,而且设置后就不能取消,除非先删掉所有的用户证书。如果安装为系统证书就不需要设置开机密码,自动化操作时更方便。
(2)Android 7以上版本APP默认不信任用户证书,只信任系统证书,安装为用户证书,对APP的HTTPS抓包会失败。安装为全局证书才能被所有APP信任,方可进行HTTPS抓包。
默认情况下,针对 Android 7.0+ (API level 24+) 的应用不再信任用户或管理员添加的CA证书来进行安全连接。(之前我们其实是将安全证书安装到安卓手机上作为用户信任安全证书,新版本如果APP开启了设置我们的代理请求会被认为是不安全的。)
Android的系统证书的存储位置是/system/etc/security/cacerts,证书文件必须是PEM格式,而且文件命名必须符合系统证书规范。
好了,今天时间也不早了,宏哥就讲解和分享到这里,感谢你耐心地阅读!!!
《吐血整理》高级系列教程-吃透Fiddler抓包教程(26)-Fiddler如何抓取Android7.0以上的Https包-上篇的更多相关文章
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(30)-Fiddler如何抓取Android7.0以上的Https包-番外篇
1.简介 通过宏哥前边几篇文章的讲解和介绍想必大家都知道android7.0以上,有android的机制不在信任用户证书,导致https协议无法抓包.除非把证书装在系统信任的证书里,此时手机需要roo ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(28)-Fiddler如何抓取Android7.0以上的Https包-下篇
1.简介 虽然依旧能抓到大部分Android APP的HTTP/HTTPS包,但是别高兴的太早,有的APP为了防抓包,还做了很多操作:① 二次加密有的APP,在涉及到关键数据通信时,会将正文二次加密后 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的Https包-终篇
1.简介 上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架.可以编写并加载自己编写的插件app,实现对目标apk的注入.拦截等.一般研究移动安全的都会使用Xposed. ...
- [转]Fiddler抓取Android真机上的HTTPS包
此篇文章转载自:http://blog.csdn.net/roland_sun/article/details/30078353 工作中经常会需要对一些app进行抓包, 但是每次默认都是只抓http请 ...
- 吐血整理 Delphi系列书籍 118本(全)
Delphi 教程 系列书籍 网友(老帅)整理 001_<Delhpi6数据库设计思想与实践> 002_<Delphi6应用开发指南> 003_<Delphi6开发人员指 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(34)-Fiddler如何抓取微信小程序的包-上篇
1.简介 有些小伙伴或者是童鞋们说小程序抓不到包,该怎么办了???其实苹果手机如果按照宏哥前边的抓取APP包的设置方式设置好了,应该可以轻松就抓到包了.那么安卓手机小程序就比较困难,不是那么友好了.所 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(33)-Fiddler如何抓取WebSocket数据包
1.简介 本来打算再写一篇这个系列的文章也要和小伙伴或者童鞋们说再见了,可是有人留言问WebSocket包和小程序的包不会抓,那就关于这两个知识点宏哥就再水两篇文章. 2.什么是Socket? 在计算 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(24)-Fiddler如何优雅地在正式和测试环境之间来回切换-中篇
1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考. 2.实际工作场景 2.1问题场景 (1)已发布 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(25)-Fiddler如何优雅地在正式和测试环境之间来回切换-下篇
1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考. 2.实际工作场景 2.1问题场景 (1)已发布 ...
随机推荐
- Hadoop学习 Hadoop-HA 解释和概念介绍
一.Hadoop-HA 1.1 Hadoop1.x带来的问题 1.单点故障 a. 每个群集只有一个NameNode,NameNode存在单点故障(SPOF). b. 如果该计算机或进程不可用,则整 ...
- ExpressionChangedAfterItHasBeenCheckedError详细解释
一个angular组件,他的生命周期是这样的 update bound properties for all child components/directives call ngOnInit, On ...
- mysql开发实战8问
mysql读写性能是多少,有哪些性能相关的配置参数? Mysql负载高时,如何找到是由哪些SQL引起的? 如何针对具体的SQL做优化? SQL层面已难以优化,请求量继续增大时的应对策略? Mysql如 ...
- lamp平台构建
目录 lamp平台构建 安装httpd 安装mysql 安装php 配置apache 启用代理模块 配置虚拟主机 启用代理模块 验证 lamp平台构建 环境说明: 系统平台 IP 需要安装的服务 ce ...
- 无痕模式下 this.StorageManager.setItem) 本地存储丢失
在无痕模式下,存的this.StorageManager.setItem("recharge", JSON.stringify(recharge))本地存储会丢失,所以我们改成使用 ...
- 【喜讯】Apache DolphinScheduler 荣获 “2020 年度十大开源新锐项目”
经 10000+ 开发者公开票选,20+专家评审. 10+ 主编团打分,历经数月打磨,11 月 19 日,由InfoQ 发起并组织的[2020中国技术力量年度榜单评选]结果正式揭晓. 2020 年度十 ...
- 关于python如何引用excel文件
关于python如何引用excel文件 import pandas as pd #引用pandas库,as:将pandas简写为pd Nowcoder = pd.read_excel("1. ...
- Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert
借着ACL2022一篇知识增强Tutorial的东风,我们来聊聊如何在预训练模型中融入知识.Tutorial分别针对NLU和NLG方向对一些经典方案进行了分类汇总,感兴趣的可以去细看下.这一章我们只针 ...
- Vue3 + Socket.io + Knex + TypeScript 实现可以私聊的聊天室
前言 下文只在介绍实现的核心代码,没有涉及到具体的实现细节,如果感兴趣可以往下看,在文章最后贴上了仓库地址.项目采用前后端模式,前端使用 Vite + Vue3 + TS:后端使用 Knex + Ex ...
- 杀死 Windows 某个端口
进入终端命令行,输入netstat -aon|findstr 3000查找端口号所对应的 PID: 输入指令taskkill /pid 20348 /f: