7.0以上系统Charles无法抓取https接口的解决方案

现象

    Android 7.0及以上系统在即使安装过证书的情况下,抓取https接口会出现:Client SSL handshake failed: An unknown issue occurred processing the certificate (certificate_unknown)问题,证书无效,导致https接口数据抓取失败问题。

原因

      在Android7.0及以上的系统中,每个应用可以定义自己的可信CA证书集。但默认情况下,应用只会信任系统预装的CA证书,而不会信任用户安装的CA证书。通过Charles安装的证书恰恰正属于用户安装的CA证书,因此会被视作不安全的证书。导致出现上面的证书不可信问题

解决方法

   如果只抓取自己项目APP的https接口,可以在项目中添加自定义CA配置,允许用户安装的CA证书可信:

  1、在res/xml目录下新建network_security_config.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides cleartextTrafficPermitted="true">
        <trust-anchors>
            <!--信任所有的系统证书-->
            <certificates src="system" />
            <!--信任所有用户安装的证书-->
            <certificates src="user" />
        </trust-anchors>
    </debug-overrides>
</network-security-config>

    2、在manifest.xml的application标签中添加如下配置:

android:networkSecurityConfig="@xml/network_security_config"

    3、正常安装charles证书,连接代理即可。   

如果需要抓取其它APP的https接口(手机需要Root):

     这个方式的原理是把用户安装的证书复制到手机的系统证书目录下,当成系统证书来用,所以:

      需要手机Root!

      需要手机Root!

      需要手机Root!

    1、手机root。

    2、找到手机上下载的charles证书,导出到PC上并获取此证书的Hash值:

         打开命令行工具,执行命令:

         openssl x509 -subject_hash_old -in 证书路径 

    3、将证书文件重命名为 hash值.0的格式,如: 1c20342s.0。(注意不要带后缀名)。

    4、将重命名好的证书通过adb push/sdcard/Download,然后将其复制到/system/etc/security/cacerts/。

    如果出现了 Read-only file system的错误,说明系统文件夹是只读的,无法修改,执行以下操作将系统文件挂载为可读写:

adb root remount

adb shell 

su

mount -o rw,remount /

    就可以正常复制文件了,复制好后将文件权限更改为644,并重启设备,之后就可以抓https接口数据了。

     

 

 

### 解决 Charles 抓包时蓝色箭头显示 unknown 的问题 #### 安卓 7.0 及以上设备 HTTPS 请求抓包解决方案 对于安卓 7.0 (API Level 24) 或更高版本的设备,在尝试通过 Charles 进行 HTTPS 流量捕获时可能会遇到 `unknown` 显示的问题。这是因为这些版本的操作系统默认不再信任用户手动添加至系统的 CA 证书[^4]。 为了使 Android 设备能够正常解析并展示 HTTPS 数据流,需执行以下操作: - **安装 Charles SSL 证书** 手机连接 Wi-Fi 后访问浏览器中的代理地址(通常是 http://chls.pro/ssl),下载并安装 Charles 的根证书。 ```bash wget http://chls.pro/ssl -O charles-cert.cer ``` - **设置应用级别的网络安全配置** 对于某些应用程序而言,还需要修改其网络安全策略来允许自定义的信任库。这通常涉及到编辑 app 的 XML 配置文件以包含 `<trust-anchors>` 和 `<certificates>` 元素指向本地存储的 Charles 证书路径。 #### macOS 下 Charles 抓取 HTTPS 请求失败处理办法 当在 Mac 上运行 Charles 并试图拦截 HTTPS 流量却只看到 `<unknown>` 提示时,则可能是由于缺少必要的 SSL 中间件认证所致[^2]。 要修正此状况,应确保已正确完成下列步骤: - **获取并导入 Charles 自签名证书** 访问菜单栏的帮助选项卡下找到 "SSL Proxying" -> "Install Charles Root Certificate..." 来启动证书部署向导过程,并按照指示保存到钥匙串中作为可信实体。 - **验证证书状态** 使用 Keychain Access 工具确认所加载的 .cer 文件确实被标记为始终信任的状态。 #### 处理映射远程服务器造成的未知错误 如果启用了 Map Remote 功能而遭遇到了类似的 `unknown` 错误消息,那么很可能是目标主机未能成功返回预期响应给客户端造成的结果[^1]。 针对这种情况建议采取措施包括但不限于: - 检查源 URL 是否可达以及目的地是否能接收转发过来的数据; - 确认中间代理链路畅通无阻,排除防火墙或其他安全机制干扰的可能性; - 尝试禁用该特性一段时间观察现象是否有改善迹象。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值