啊宇哥哥 2025-10-03 09:30 采纳率: 98.5%
浏览 1
已采纳

Charles抓包提示SSL证书未信任如何解决?

在使用Charles进行HTTPS抓包时,常遇到“SSL证书未信任”提示,导致无法正常解密HTTPS请求。此问题通常因Charles根证书未被系统或浏览器信任所致。即使安装了证书,部分操作系统(如macOS)或浏览器(如Chrome)仍会因安全策略拒绝信任。此外,iOS 10及以上版本需手动开启完全信任选项。如何正确安装并信任Charles证书,确保移动端和桌面端均可顺利抓取HTTPS流量,是开发者调试过程中必须解决的关键问题。
  • 写回答

1条回答 默认 最新

  • 小丸子书单 2025-10-03 09:30
    关注

    一、问题背景与核心原理

    在现代Web开发与移动应用调试中,使用Charles Proxy进行HTTPS抓包已成为标准实践。然而,由于HTTPS协议本身基于SSL/TLS加密,直接嗅探明文数据不可行。Charles通过“中间人攻击”(MITM)机制实现解密:它生成一个动态的SSL证书,并以自身作为代理服务器拦截请求。此时,客户端必须信任Charles的根证书(Charles Proxy CA),否则会触发“SSL证书未信任”警告。

    该问题的根本原因在于操作系统的证书信任链管理机制。即使用户已将Charles证书导入系统或浏览器,若未正确配置为“完全受信”,系统仍会拒绝建立安全连接。尤其在macOS、iOS及新版Chrome中,出于安全策略强化,默认不自动信任用户添加的证书。

    二、常见错误场景与现象分析

    • 安装证书后仍提示“您的连接不是私密连接”(Chrome)
    • iOS设备上无法加载任何HTTPS页面,仅HTTP正常
    • macOS系统偏好设置中证书状态为“此证书尚未被信任”
    • Android 7+ 应用因网络安全配置(network_security_config)忽略用户证书
    • Electron或WebView应用内置证书校验绕过系统信任库

    三、操作系统级证书信任配置流程

    1. 启动Charles,进入 Help → SSL Proxying → Install Charles Root Certificate
    2. 系统自动打开钥匙串访问(macOS)或下载.cer文件
    3. 在“系统”或“登录”钥匙串中找到“Charles Proxy CA”证书
    4. 双击证书,展开“信任”选项
    5. 将“使用此证书时”设置为“始终信任”
    6. 关闭窗口并输入系统密码保存更改
    7. 重启Charles与浏览器生效
    平台证书安装路径信任方式额外步骤
    macOS钥匙串访问 → 登录/系统手动设为“始终信任”需重启应用
    Windows证书管理器 (certmgr.msc)导入至“受信任的根证书颁发机构”管理员权限
    iOS设置 → 已下载描述文件设置 → 通用 → 关于本机 → 证书信任设置启用“完全信任Charles”
    Android设置 → 安全 → 加密与凭据 → 安装证书需在App网络安全配置中显式允许用户证书修改AndroidManifest.xml
    Chromechrome://settings/certificates导入但受限于OS底层策略依赖系统信任状态

    四、移动端特殊处理机制

    iOS自iOS 10.3起引入了“完全信任”机制,防止恶意证书滥用。即使证书已安装,也必须手动开启信任:

    
    步骤:
    1. 设置 → 通用 → 描述文件与设备管理
    2. 找到“Charles Proxy Certificate”
    3. 点击“安装”并完成验证
    4. 返回设置主菜单 → 通用 → 关于本机
    5. 滚动到底部进入“证书信任设置”
    6. 启用对“Charles Proxy CA”的完全信任
        

    对于Android设备,特别是Android 7及以上版本,系统默认不再信任用户安装的CA证书。解决方法包括:

    • res/xml/network_security_config.xml中配置:
    <network-security-config>
        <base-config>
            <trust-anchors>
                <certificates src="system" />
                <certificates src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>

    五、浏览器与应用层隔离问题

    现代浏览器如Chrome、Edge采用独立于操作系统的证书存储机制。尽管系统已信任证书,浏览器仍可能拒绝。解决方案:

    • 通过 chrome://settings/security 进入证书管理
    • 导入Charles证书至“受信任的根证书颁发机构”
    • 注意:Chrome on macOS依赖Keychain状态,无需单独导入

    对于使用自定义SSL校验逻辑的应用(如OkHttp、Flutter WebView),需在代码中显式允许代理证书:

    // OkHttp示例:允许所有证书(仅限调试)
    OkHttpClient client = new OkHttpClient.Builder()
        .sslSocketFactory(sslSocketFactory, trustManager)
        .hostnameVerifier((hostname, session) -> true)
        .build();

    六、自动化诊断与流程图

    当遇到SSL解密失败时,可遵循以下决策流程:

    graph TD A[HTTPS请求失败] --> B{是否显示SSL证书错误?} B -- 是 --> C[检查Charles证书是否已安装] C --> D[是否已在系统/浏览器信任列表中?] D -- 否 --> E[重新安装并设置为完全信任] D -- 是 --> F[iOS是否开启完全信任?] F -- 否 --> G[前往设置启用信任] F -- 是 --> H[检查Charles SSL Proxying规则] H --> I[是否包含目标域名?] I -- 否 --> J[添加对应域名或*.domain.com] I -- 是 --> K[确认设备代理指向Charles IP:端口] K --> L[问题解决]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 10月3日