Charles 无法抓取 Android 7 及以上手机 HTTPS 协议的深度解析与解决方案

在移动应用开发与测试过程中,网络抓包工具是我们排查问题、分析数据交互的重要助手。Charles 作为一款功能强大的抓包工具,广泛应用于 iOS 和 Android 平台。然而,不少开发者和测试人员在使用 Charles 抓取 Android 7 及以上版本手机的 HTTPS 协议时,遇到了抓包失败的情况。本文将深入探讨这一问题的根源,详细分析 Android 7 及以上系统在网络安全配置方面的区别,并提供切实可行的解决方案。​

一、Charles 抓包 HTTPS 的基本原理​

在理解问题之前,我们需要先了解 Charles 抓取 HTTPS 流量的基本原理。当手机与 Charles 代理服务器连接后,Charles 会作为中间人,在客户端(手机)和服务器之间建立安全连接。具体来说,Charles 会生成一个自签名的 CA 证书,手机安装该证书后,当手机向服务器发起 HTTPS 请求时,会将 Charles 的 CA 证书视为可信证书,从而允许 Charles 拦截并解密 HTTPS 流量,实现对加密数据的抓取和分析。

二、Android 7,8,9 网络安全配置差异对比

自 Android 7(24)发布以来,Google 对网络安全策略进行了重大调整,其中最核心的变化是引入了 ** 网络安全配置(Network Security Configuration)** 机制。这一机制允许开发者通过 XML 文件精细控制应用的网络行为,包括信任的证书颁发机构(CA)、明文流量限制等。对于 Charles 这类抓包工具而言,这一变化直接导致其默认的中间人代理模式在 Android 7 + 设备上失效,尤其是在处理 HTTPS 请求时候,下面是不同系统配置文件,

Android7 ~8.1 引入网络安全配置,默认不信任用户 CA 证书

<network-security-config>
  <base-config>
    <trust-anchors>
      <certificates src="system" />
    </trust-anchors>
  </base-config>
</network-security-config>

**仅信任系统 CA,用户 CA 被排除

Android 9(API 28):HTTPS 的全面强制化

<network-security-config>
  <!-- 禁止所有明文流量 -->
  <base-config cleartextTrafficPermitted="false">
    <trust-anchors>
      <certificates src="system" />
    </trust-anchors>
  </base-config>
  <!-- 允许特定域名的HTTP请求 -->
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">example.com</domain>
  </domain-config>
</network-security-config>

**禁止明文流量(cleartextTrafficPermitted="false"),进一步限制信任范围

三 配置应用的网络安全配置文件(开发者角度)​

如果您是应用开发者,可以通过配置网络安全配置文件,允许应用信任用户 CA 证书,从而使得 Charles 能够抓取该应用的 HTTPS 流量。以下是具体步骤:​

  1. 创建网络安全配置文件​
  2. 在项目的res/xml/目录下创建一个新的 XML 文件,例如network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

​其中,<certificates src="user" />表示允许信任用户安装的 CA 证书,<certificates src="system" />表示信任系统 CA 证书,cleartextTrafficPermitted="true"表示允许明文流量(根据需求可设置为 false)。​

3 在 AndroidManifest.xml 中引用配置​

<application
  android:networkSecurityConfig="@xml/network_security_config">
</application>

​4 重新编译和安装应用​

 完成配置后,重新编译应用并安装到手机上,此时应用将按照网络安全配置文件的设置,信任用户安装的 Charles CA 证书,从而可以被 Charles 抓取 HTTPS 流量。

四 写在最后

 在日常测试工作中,为了保证外发版本安全性,这种修改几乎不做,如果为了测试接口功能,会使用iOS系统或者Android6系统手机。

~欢迎同行交流学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

myting

感恩打赏!泡面终于能加蛋

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值