在使用Charles进行HTTPS抓包时,用户常遇到“证书下载后无法信任”的问题。尽管已将Charles根证书安装至系统或设备的信任设置中,系统仍提示连接不安全。此问题多见于iOS新版本或macOS系统中,因苹果加强了对根证书的信任管理,要求用户需在“设置-通用-关于本机-证书信任设置”中手动启用对Charles证书的完全信任。若未完成该步骤,即便证书已安装,系统也不会将其视为可信CA,导致HTTPS解密失败。此外,Android 7及以上版本也对用户安装的证书处理更严格,需将证书放入系统受信任凭据中才可生效。
1条回答 默认 最新
小小浏 2025-09-28 09:30关注使用Charles进行HTTPS抓包时证书信任问题的深度解析与解决方案
1. 问题背景与常见现象
在移动应用开发、接口调试和安全测试中,Charles Proxy作为一款强大的HTTP/HTTPS抓包工具被广泛使用。然而,许多开发者在配置HTTPS抓包时频繁遇到“证书已安装但无法信任”的问题。
- iOS设备提示“此连接不安全”,即使Charles根证书已在“设置-通用-关于本机-证书”中显示为已安装。
- macOS系统中Safari或部分App仍拒绝建立SSL连接,报错SSL_ERROR_BAD_CERT_DOMAIN等。
- Android 7及以上版本的应用(尤其是targetSdkVersion ≥ 24)忽略用户安装的CA证书。
这些问题的根本原因在于现代操作系统对自定义根证书的信任机制进行了强化,不再默认信任用户手动安装的CA。
2. 根本原因分析:操作系统安全策略演进
平台 系统版本 证书信任策略变化 iOS iOS 10.3+ 需在“证书信任设置”中手动启用完全信任 macOS macOS Sierra (10.12)+ Keychain中需将证书设为“始终信任” Android Android 7 (Nougat)+ 应用默认不信任用户CA,除非显式配置 iOS iOS 13+ 企业级描述文件限制增强,影响非App Store分发证书 Android Android 10+ Scoped Storage进一步限制证书访问 3. 解决方案路径图
```mermaid graph TD A[启动Charles] --> B[导出Charles根证书] B --> C{目标平台?} C -->|iOS| D[安装到设置-通用-关于本机] D --> E[进入证书信任设置启用完全信任] C -->|macOS| F[导入Keychain Access] F --> G[右键证书 -> 始终信任] C -->|Android| H[放入系统受信任凭据] H --> I[修改Network Security Config] I --> J[重启App生效] E --> K[开始HTTPS抓包] G --> K J --> K ```4. 平台级详细操作步骤
- iOS设备:
- 通过Wi-Fi将设备连接至运行Charles的电脑,并配置代理。
- 访问 chls.pro/ssl 下载并安装Charles证书。
- 进入“设置”→“通用”→“关于本机”→“证书信任设置”。
- 找到“Charles Proxy CA”并启用“完全信任”。
- macOS系统:
- 从Charles菜单导出证书(Help → SSL Proxying → Save Charles Root Certificate...)。
- 双击.cer文件将其添加到“系统钥匙串”。
- 在Keychain Access中右键该证书,选择“始终信任”。
- Android设备:
- 下载Charles证书并保存为 .crt 文件。
- 进入“设置”→“安全”→“加密与凭据”→“安装证书”→“CA证书”。
- 对于targetSdkVersion ≥ 24的应用,需在res/xml/network_security_config.xml中声明:
5. Android高级配置示例
<network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config>并在AndroidManifest.xml中引用:
<application android:networkSecurityConfig="@xml/network_security_config" ... >6. 调试技巧与验证方法
可通过以下方式验证证书是否被正确信任:
- 在iOS上打开Safari访问任意HTTPS站点,若无警告则说明信任成功。
- 在Charles中观察SSL handshake日志,查看是否有“Client did not trust server certificate”记录。
- 使用命令行工具openssl验证本地证书链:
openssl s_client -connect api.example.com:443 -showcerts检查返回结果中是否包含Charles的颁发者信息(如“CN=Charles Proxy CA”)。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报