Charles Android 抓包失败SSLHandshake: Received fatal alert: certificate_unknown

前提:

Android使用Charles抓取Https请求的报文时,Android和Charles都正确安装了证书之后出现抓包失败,报错SSLHandshake: Received fatal alert: certificate_unknown,如下图所示:

原因:

安卓7之后调整了安全策略会导致部分手机抓包失败,请参考此链接:https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html

文中提到默认情况下,针对API Level 24及更高版本的应用程序不再信任用户或管理员添加的CA用于安全连接。意思就是就算你在手机上安装了受信任的证书也是没卵用的。

解决办法 一:

前提你的手机上已经正确安装了Charles证书:

  1. 在你的AndroidManifest.xml文件中添加如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
    ...
    </application>
    </manifest>
    
  2. 在res目录下新建一个xml文件夹,之后在res/xml/路径下新建文件network_security_config.xml

    res/xml/network_security_config.xml:

    <?xml version="1.0" encoding="utf-8"?>
        <network-security-config>
            <domain-config>
            <domain includeSubdomains="true">你要抓取的域名</domain>
            <trust-anchors>
            <certificates src="user"/>//信任用户自己安装的证书
            </trust-anchors>
        </domain-config>
    </network-security-config>
    

解决办法 二:

手机上是否有装证书都可以使用下面的方法:

  1. 在你的AndroidManifest.xml文件中添加如下配置:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest ... >
        <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
    ...
    </application>
    </manifest>
    
  2. 在res目录下新建一个xml文件夹,之后在res/xml/路径下新建文件network_security_config.xml

    res/xml/network_security_config.xml:

    <?xml version="1.0" encoding="utf-8"?>
        <network-security-config>
            <domain-config>
            <domain includeSubdomains="true">你要抓取的域名</domain>
            <trust-anchors>
            <certificates src="@raw/证书文件名"/>
            </trust-anchors>
        </domain-config>
    </network-security-config>
    
  3. 在res目录下新建一个raw文件夹,将手机上安装的证书文件放入res/raw/目录下,证书格式:pem,ca等(chales的话就是将你在手机浏览器打开http://charlesproxy.com/getssl下载的证书放入即可),步骤2中的证书文件名,就是你放入res/raw/目录下文件的名字

配置完重新运行项目,就可以看到报文了!

更多配置方法请参考Google-Android

### Charles 抓包时 SSL 握手失败问题的解决方案 在使用 Charles 抓取 HTTPS 数据包时,如果出现 `SSLHandshake: Received fatal alert: certificate_unknown` 错误,通常是因为客户端无法信任 Charles 的自签名证书。以下是解决该问题的详细方法: #### 1. 确保正确安装 Charles 证书 确保设备上已正确安装 Charles 的根证书,并且浏览器或应用程序能够识别并信任该证书。具体步骤如下: - 在 Charles 中生成并导出证书。 - 将证书安装到目标设备的信任存储中[^1]。 #### 2. 配置 Android 应用的安全策略 对于 Android 应用,从 Android 7.0(API 级别 24)开始,默认情况下应用会忽略用户安装的 CA 证书。为了解决此问题,需要在应用的 `AndroidManifest.xml` 文件中添加网络安全配置文件的引用[^3]: ```xml <manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > </application> </manifest> ``` 同时,在 `res/xml/network_security_config.xml` 文件中定义以下内容以信任用户安装的证书[^4]: ```xml <?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="user" /> <certificates src="system" /> </trust-anchors> </base-config> </network-security-config> ``` #### 3. 针对特定域名的信任配置 如果只需要抓取特定域名的数据包,可以在 `network_security_config.xml` 中定义 `domain-config`,仅对该域名启用用户证书信任[^5]: ```xml <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config> <domain includeSubdomains="true">example.com</domain> <trust-anchors> <certificates src="user" /> </trust-anchors> </domain-config> </network-security-config> ``` #### 4. 解决 Python 程序中的 SSL 证书验证问题 如果在 Python 程序中遇到类似的 SSL 证书验证失败问题,可以尝试以下方法[^2]: - 忽略 SSL 验证(仅用于测试环境): ```python import ssl import urllib.request ssl._create_default_https_context = ssl._create_unverified_context response = urllib.request.urlopen('https://example.com') print(response.read()) ``` - 或者将 Charles 的证书导出并添加到程序的信任链中。 #### 5. 检查网络代理设置 确保设备的网络代理设置正确指向 Charles,并且 Charles 已启用 SSL 代理功能。可以在 Charles 的 `Proxy` -> `SSL Proxying Settings` 中添加需要抓取的域名。 ---
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值