在移动应用开发与测试过程中,网络抓包工具是我们排查问题、分析数据交互的重要助手。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 流量。以下是具体步骤:
- 创建网络安全配置文件
- 在项目的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系统手机。
~欢迎同行交流学习