Python 爬虫时,高版本 App 如何进行抓包?
我们都知道 iphone 和低版本 Android 抓包,只需要设置代理和配置证书就可以顺利抓包
但是升级了 targetSdkVersion 到 28 后发现,在 Android 7.0 以上机型 Charles 抓取 https 包时显示找不到证书,但是 Android 6.0 机型还是可以正常抓包。
这其中的原因是,从 Android 7.0 开始,默认的网络安全性配置修改了
解决方法如下:
现象:android7.0 以上的手机 https 抓包失败(安装了 https 证书也不行)
原因:android7.0+ 的版本新增了证书验证(系统证书),具体如下:
1、Android 6.0(API 23)及更低版本应用的默认网络安全性配置如下:
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
<!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
<certificates src="user" />
</trust-anchors>
</base-config>
2、而在 Android 7.0(API 24)到 Android 8.1(API 27)的默认网络安全性配置如下:
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
</trust-anchors>
</base-config>
3、而在 Android 9.0(API 28)及更高版本的默认网络安全性配置如下:
<!-- 默认禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="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 请求)
解决办法:
前提:在手机端和电脑端都必须安装 https 的安全证书 配置:打测试包时,项目设置默认信任所有证书(系统 + 用户,Charles 和 Fiddler) 1、在项目工程 res-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>
2、在 AndroidManifest 里的标签中,添加如下代码,在清单文件中指向该文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
重新打包项目,然后抓包,即可成功
Webview 抓包失败
上面可以解决 Android 原生抓包问题,但在 Android7.0 以上的手机,开着网络代理访问不了Webview
若要抓包webview,需要在 Webview 的 WebViewClient 中,将一行代码给注释掉:
super.onReceivedSslError(view, handler, error)
这样是为了忽略掉 SSL 证书错误
因为开启代理后网络会变得不安全,证书会报错误,Webview 检测到证书错误之后就不请求任何数据。注释是为了忽略掉父类的处理,默认执行下去。
警告
这样的配置操作是敏感且危险的,只能用于测试环境方便抓包,线上包一定注意要恢复配置,不然 APP 会面临被他人抓包的风险。
如何只在调试模式下允许抓包呢?
使用 <debug-overrides>
即可实现:只在 android:debuggable
为 true
时才生效的配置
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!-- 支持 Android 7.0 以上调试时,信任 Charles 和 Fiddler 等用户信任的证书 -->
<debug-overrides>
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
网上有些解决方式是将 Charles 和 Fiddler 的证书添加到 raw
文件夹下的方式也可以,但是繁琐了点
在 Android 9.0(API 28)以上允许部分 http 请求
最佳的解决方式肯定是全部使用 https 请求,安全性更高,如果有些请求或测试环境下还是需要使用 http 请求,需要在网络安全性配置添加白名单:
<?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="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
后记 通过查找资料,还有一个方法,通过重载 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();
}
}
- React多页面应用1
- jQuery操作Select
- MSDN杂志上的Windows Phone相关文章
- WCF Data Service工具包
- WordPress 文章截断方式:有more标签的优先more标签,否则截断一定字数
- 为什么要探索宇宙
- Redis的各项功能解决了哪些问题?
- WordPress.com 宣布支持Markdown 语言
- 使用Topshelf 5步创建Windows 服务
- TGM Plugin Activation:为WordPress 主题添加“插件推荐安装”功能
- [腾讯社区开放平台]介绍开放授权协议-OAuth
- HTML5规范的本地存储
- ASP.NET Web API 处理架构
- ASP.NET MVC 4中的单页面应用程序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【STM32F407开发板用户手册】第23章 STM32F407的USART串口基础知识和HAL库API
- 小姐姐提灯给你讲讲动态规划(万字长文)
- 解决fedora启动时显示cannot open font file true的办法 By HKL,
- 盘点 6 个被淘汰的 Java 技术,它们都曾经风光过!
- Unlock a VBA password protected Excel file By HKL,
- kde安装gtk主题(kde-gtk-theme)KDE4下gtk程序美化 By HKL,
- Monkey's Audio vs. WavPack vs. FLAC By HKL,
- 彻底屏蔽优酷广告 By HKL, Monday 12 Au
- C# 如何给Winform的button等控件添加快捷键 By HKL,
- kmskeys10 By HKL, Saturday 7
- C# Random 生成不重复随机数 By HKL, We
- Resin4配置 By HKL, Thursday 11
- 从源码编译N(ginx)+M(ySQL)+P(HP)并安装WordPress By HKL,
- MPEG4视频中,I帧、p帧、B帧的判定(转载) By HKL,
- 使用attrib命令解决存储器中毒后文件夹被隐藏的方法 By HKL,