Android中7.0及以上手机无法使用Charles抓取https数据的解决方法

本文详细介绍了如何在Android 7.0及以上版本中解决Charles抓包工具无法查看HTTPS接口数据的问题。通过调整应用配置,实现默认信任所有证书,使测试过程更加顺畅。

最近,测试小哥哥提出公司的部分7.0以上的测试机无法进行Charles抓包查看https的接口数据。

通过一波的查阅资料过后发现:android7.0+的版本新增了证书验证,https的安全证书手机端和电脑端都必须安装,这个是前提;又由于android手机多厂商系统定制的问题,可能有部分手机确实无法抓包,这里,对于抓包的问题上,我们在给测试打包的时候要对我们的项目进行添加设置: 默认信任所有证书。

这个操作其实是比较敏感的,线上不能带上这个配置;下面来说一下相关配置项:

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里的<application>标签中,添加代码:

android:networkSecurityConfig="@xml/network_security_config"

修改完毕后,重新运行项目,在抓包的手机上配置好代理,就可以进行https的抓包了。

特此记录一下

使用 Charles 抓取 HTTPS 数据时,需要进行一系列配置来启用 SSL 代理功能,使得 Charles 能够作为中间人解密 HTTPS 流量。以下是详细的配置方法: 1. **安装 Charles 的 CA 证书** 在抓取 HTTPS 数据之前,必须安装 Charles 的根证书,这样才能进行中间人解密。可以通过 Charles 的菜单栏选择 `Help` → `SSL Proxying` → `Install Charles Root Certificate` 来安装证书。安装后,系统会提示信任该证书,确保选择始终信任[^1]。 2. **启用 SSL 代理设置** 打开 Charles,点击顶部菜单栏的 `Proxy` → `SSL Proxying Settings`。在弹出的窗口中,点击 `Add` 按钮,输入 Host 为 `*`,Port 为 `443`,然后点击 `OK`。这样可以启用对所有 HTTPS 网站的代理。最后重启 Charles 以确保设置生效[^3]。 3. **配置设备代理** 如果要抓取移动设备上的 HTTPS 流量,确保设备与运行 Charles 的电脑处于同一局域网中。然后在设备的 Wi-Fi 设置中配置代理,输入运行 Charles 的电脑的 IP 地址和端口号(默认为 8888)。此外,可以在 Charles 的 `Help` → `SSL Proxying` → `Install Charles Root Certificate on a Mobile Device or Remote Browser` 页面查看推荐的 IP 地址,若显示的是无线网络 IP 地址,建议关闭无线网络以避免冲突[^2]。 4. **处理 Android 7.0 及以上版本的信任问题** Android 7.0 及以上系统默认不再信任用户安装的证书,因此需要使用 VirtualXposed 工具配合 JustTrustMe 插件来绕过证书验证。在 VirtualXposed 中添加需要抓包的应用,并启用 JustTrustMe 插件,重启后即可正常抓取 HTTPS 流量[^4]。 5. **开始抓包** 配置完成后,启动 Charles 并打开需要抓包的应用。Charles 会自动记录所有 HTTP/HTTPS 请求。对于 HTTPS 请求,如果配置正确,Charles 会显示解密后的明文数据;否则会显示为加密状态,此时需要检查证书安装和 SSL 代理设置是否正确[^1]。 ```python # 示例代码:模拟 HTTPS 请求抓包数据结构 class HTTPSPacket: def __init__(self, host, path, method, headers, body): self.host = host self.path = path self.method = method self.headers = headers self.body = body def display(self): print(f"Host: {self.host}") print(f"Path: {self.path}") print(f"Method: {self.method}") print("Headers:") for key, value in self.headers.items(): print(f" {key}: {value}") print(f"Body: {self.body}") # 模拟一个 HTTPS 请求 packet = HTTPSPacket( host="example.com", path="/api/data", method="GET", headers={"User-Agent": "Charles", "Accept": "application/json"}, body="" ) packet.display() ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值