Android 实现抓取Https数据
1.为啥要会抓包
a.当公司没有接口文档,但需要做接口测试的时候,需要通过代理工具,对接口进行抓取。
b.当开发上传图片时,不知道自己到底上传没上传,这时候就可以通过抓包来收集证据,避免后台甩锅。
2.电脑手机同一局域网,设置手机手动代理。
a.可通过Charles查看电脑IP地址,也可以通过命令行输入ipconfig查看IP地址
b.之后通过设置手机手动代理,端口号设置为8888
设置完后,Charles会弹出一个框框,如下图所示,然后选择Allow。
这样就可以愉快的抓取手机的请求信息了。
c.到目前为止只能抓取Http接口的数据,如果是Https的请求就会出现下图的这种情况。那么我们应该怎么办呢?
3.抓取Https,Charles需要设置什么
a.先打开Charles 的代理功能:在菜单栏上选择“Proxy -> Proxy Settings”,填入代理端口 8888,并且勾上 “Enable transparent HTTP proxying”;b.再选择“Proxy—SSL Proxy Settings”,勾选“Enable SSL Proxying”,在Location部分选择add,如下图所示,host中填" * ",port中填“ * ”,表示任务域名的数据;
c.在Charles 的顶部菜单,点击“Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser”;
然后会出现一个弹窗,点击弹窗中“确定”;
4.抓取Https,手机需要设置什么
a.打开手机浏览器,输入http://chls.pro/ssl,访问该地址会下载charles证书,将此证书安装到手机上;
b.在设置里面搜索证书,然后点击安装证书,然后找到刚才的证书点击安装。
5.Android 7.0 以上Charles无法抓取HTTPS包解决
从 Android 7.0 开始,默认的网络安全性配置修改了。所以需要进行一些代码上的配置操作。
a.Android 6.0及更低版本的应用默认网络安全性配置如下:
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
<!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
<certificates src="user" />
</trust-anchors>
</base-config>
b.Android 7.0-8.0的默认网络安全性配置如下:
<!-- 默认允许所有明文通信 -->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
</trust-anchors>
</base-config>
c.Android 9.0及更高版本的默认网络安全性配置如下:
<!-- 默认禁止所有明文通信 -->
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
</trust-anchors>
</base-config>
通过a、b、c的对比可以从中发现规律,在 Android 7到 Android 8.1,默认不再信任用户添加的 CA 证书,所以也就不再信任 Charles抓包工具的证书,所以抓取 HTTPS 包时才会失败。而且在 Android 9.0(API 28)及更高版本上,不仅只默认系统预装的 CA 证书,还默认禁止所有明文通信(不允许 http 请求)。
划重点(大招来了)
前提:在手机端和电脑端都必须安装https的安全证书
配置:打测试包时,项目设置默认信任所有证书(系统+用户,Charles)
First:在工程res文件夹下的xml目录(没有xml就自己创建一个)中创建一个名为 network_security_config.xml的文件
<?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>
<!-- 信任系统预装 CA 证书 -->
<certificates src="system" />
<!-- 信任用户添加的 CA 证书,Charles 和 Fiddler 抓包工具安装的证书属于此类 -->
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
Second:在AndroidManifest里的标签中,添加如下代码,在清单文件中指向该文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>
然后重新再运行项目,结果看下方。
6.完结撒花
这样就可以快乐的看到抓取https的请求了。