抓包大全 通过Charles抓取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 证书,CharlesFiddler 抓包工具安装的证书属于此类 -->
        <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 以上调试时,信任 CharlesFiddler 等用户信任的证书 -->
    <debug-overrides>
        <trust-anchors>
            <!-- 信任系统预装 CA 证书 -->
            <certificates src="system" />
            <!-- 信任用户添加的 CA 证书,CharlesFiddler 抓包工具安装的证书属于此类 -->
            <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的请求了。
在这里插入图片描述


版权声明:本文为qq_38363506原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。