Charles HTTPS 抓包失败深度解析:从 Android 7.0 到证书固定(Certificate Pinning)

Charles HTTPS 抓包失败深度解析:从 Android 7.0 到证书固定(Certificate Pinning)
Charles HTTPS 抓包失败深度解析从 Android 7.0 到证书固定Certificate Pinning1. 问题背景与核心挑战当开发者尝试使用 Charles 对 Android 设备进行 HTTPS 抓包时经常会遇到各种失败情况。这些问题的根源往往与 Android 系统的安全机制演进密切相关尤其是从 Android 7.0 开始引入的网络安全性配置Network Security Configuration和证书固定Certificate Pinning机制。典型症状包括手机设置代理后无法联网HTTPS 请求显示为Unknown或SSL Handshake Failed特定应用完全无法捕获请求低版本 Android 正常但高版本失败提示抓包失败不一定是配置错误可能是系统级的安全限制。理解这些限制的底层原理比盲目尝试各种解决方案更重要。2. Android 版本与证书信任机制演变2.1 信任锚点Trust Anchors的变化Android 系统对证书的信任机制经历了重大变革Android 版本信任用户证书信任系统证书典型表现7.0✓✓安装 Charles 证书即可抓包≥7.0 (targetSdk24)✓✓仍可抓包但需注意配置≥7.0 (targetSdk≥24)✗✓默认拒绝用户安装的 CA 证书!-- Android 7.0 的默认网络安全配置 -- network-security-config base-config cleartextTrafficPermittedfalse trust-anchors certificates srcsystem / !-- 仅信任系统证书 -- /trust-anchors /base-config /network-security-config2.2 网络安全性配置NSC从 Android 7.0 开始引入的network_security_config.xml允许开发者精细控制应用的安全策略!-- 调试版专用配置示例 -- debug-overrides trust-anchors certificates srcsystem / certificates srcuser / !-- 允许用户证书 -- /trust-anchors /debug-overrides关键影响未显式配置 NSC 的应用默认不信任用户证书生产环境应用通常禁用调试配置系统应用可能采用更严格的证书策略3. 证书固定Certificate Pinning的攻防3.1 技术原理证书固定通过在客户端预置服务端证书指纹防止中间人攻击// 示例OkHttp 的证书固定配置 CertificatePinner pinner new CertificatePinner.Builder() .add(example.com, sha256/AAAAAAAAAAAAAAAA) .build();3.2 绕过方案对比方案类型适用条件操作复杂度风险等级修改 NSC拥有应用源码低低Xposed 模块已 root 设备中中Frida 脚本需动态注入高高反编译修改无加固保护极高高注意绕过证书固定可能违反应用的使用条款仅限授权测试使用4. 实战解决方案4.1 基础环境准备必要检查清单确保电脑和手机在同一局域网关闭防火墙/安全软件的干扰验证 Charles 代理端口(默认8888)未被占用在Proxy Settings中启用透明代理# 检查端口占用(Mac/Linux) lsof -i :8888 # 临时关闭防火墙(Mac) sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate off4.2 分版本处理策略对于 Android 7.0安装 Charles CA 证书设置 WiFi 手动代理在系统证书库中信任该证书对于 Android ≥7.0方案A修改应用配置创建res/xml/network_security_config.xml添加用户证书信任配置在 AndroidManifest 中引用配置application android:networkSecurityConfigxml/network_security_config方案B系统级解决方案将 Charles 证书安装到系统证书库需 root使用 Magisk 模块修改系统验证逻辑对于模拟器可直接修改系统镜像# 将用户证书移动到系统证书目录(需root) cp /data/misc/user/0/cacerts-added/* /system/etc/security/cacerts/ chmod 644 /system/etc/security/cacerts/*5. 高级调试技巧5.1 双向认证突破当遇到客户端证书认证时使用 Frida 导出客户端证书在 Charles 中配置客户端证书通过 Hook 绕过证书校验逻辑// Frida 脚本示例导出SSL上下文 Interceptor.attach(SSL_CTX_new, { onLeave: function(retval) { console.log(SSL_CTX created: retval); gCtx retval; } });5.2 流量镜像分析当无法直接抓包时使用tcpdump捕获原始流量通过 Wireshark 分析加密前数据结合 Xposed 记录应用内部请求# Android 设备上抓包 adb shell tcpdump -i any -s 0 -w /sdcard/capture.pcap6. 安全与伦理边界合法合规建议仅测试自己开发或授权测试的应用生产环境数据需脱敏处理禁止绕过安全机制进行未授权访问测试完成后及时移除调试配置风险规避措施使用测试专用设备配置独立的测试网络定期清理捕获的数据遵守公司安全审计要求