一、说明

在做客户端开发的时候大家一定经常用到抓包工具去抓接口排查调试,非常的简捷方便。Charles 是一款非常好用的抓包工具,我在日常开发中也很喜欢用其进行接口联调、问题排查。

以前的客户端接口请求大多是 Http 传输的,抓接口直接配置代理就可以了,而现在很多应用都改为使用 Https 加密传输,用 Charles 直接查看完全是一堆乱码。 Charles 到底可以抓包 Https 吗 ? 作为一款强大的抓包工具,当然是可以的,但是需要做一些配置才可以。

二、iOS 配置

声明一下:我的 Charles 是汉化版的,大家如果是英文版的也可以对比名称自己找对应的选项去操作。

第1步:在电脑上安装 Charles 证书

操作后显示:

上面有提示“此根证书不被信任”,这个不用理会。

第2步:手机安装证书

操作后显示:

接下来根据提示,在手机上操作:

  1. 配置代理
  2. 打开浏览器在地址栏输入 chls.pro/ssl,会提示下载证书
  3. 步骤截图(iOS 10)

        

如果是 iOS11,有2点区别:

  1. 不像上面的截图自动跳转到证书安装页面,需要进入系统设置的首页,在列表的靠上位置会多出一个“描述文件”选项,点击一下即可进入证书安装页面。
  2. 安装完需要手动信任一下证书:
    1. 设置
    2. 通用
    3. 关于本机
    4. 证书信任设置
    5. charles proxy custom root certificate
    6. 信任该证书

第3步:Charles 配置抓包

SSL 代理设置:

记录设置:

添加要代理的接口:

配置完这些就可以正常抓取 https 接口了。

三、Android 配置

Android 配置和 iOS 配置原理基本上大同小异。

我以小米手机为例说一下步骤:

  1. Charles 安装证书
  2. 系统设置中提前配置好代理
  3. 在浏览器中输入地址下载证书文件,下载完后可以在浏览器的下载结果中查看到该文件,然后记一下存储地址,等下要用
  4. 系统设置 -> 更多设置 -> 系统和安全 -> 从存储设备安装 -> 通过步骤2中记下的路径找到文件并选择 -> 输入密码安装
  5. 安装完后 Charles 配置该有的 url
  6. 完成以上步骤后就可以抓包了

其实上面我把安装证书和 Charles 配置又说了一遍,如果是电脑上已经安装过证书,也配置过 url ,直接操作步骤2、3、4就可以了。

此处注意:我在华为手机上下载证书是正常的,而在小米手机上下载的证书却完全不可用,之后我是尝试把华为手机上的证书传给小米手机去使用的。

这样 Android 端的 https 配置就搞定了。

四、问题

问题 1:Android 7.0 配置后不可用

在 Android 7.0 及以上的系统中,每个应用可以定义自己的可信 CA 集。默认情况下,应用只会信任系统预装的 CA 证书,而不会信任用户安装的CA证书。通过 Charles 安装的证书恰恰正属于用户安装的 CA 证书,因此会被视作不安全的证书。

解决方案:

配置文件:AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application 
        android:networkSecurityConfig="@xml/network_security_config"
    ... >
    ...
    </application>
</manifest>

配置文件:res/xml/network_security_config.xml

<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" overridePins="true" /> <!--信任系统证书-->
            <certificates src="user" overridePins="true" /> <!--信任用户证书-->
        </trust-anchors>
    </base-config>
</network-security-config>

问题 2:SSL Proxying not enabled for this host: enable in Proxy Settings

Charles 的早期版本配置完以上步骤就没什么问题了,但是近期版本,需要添加额外的配置。

在这儿配置好你自己的域名就可以了。

问题 3:nodename nor servname provided, or not known

有两种情况会报这个问题:

  1. 电脑连接了其它代理:
    1. 检查本机是否有使用 VPN 软件连接网络。
    2. 检查是否连接了带海外 VPN 的 WIFI 网络。
  2. DNS 被一些软件篡改了。你可以检查一下自己的 DNS 是否有问题。如果对 DNS 不太了解,你可以让服务端开发人员协助你检验一下 DNS 是否有问题。

MAC 电脑查看 DNS 方式:系统偏好设置 -> 网络 -> 高级 -> NDS 

将 DNS 删除即可。

问题 4:Charles failed to resolve the name of the remote host into an IP address.

有可能是你的 DNS 被篡改了,解决方案同“问题 3”。

问题 5:503 Error

错误提示:

Failure    UnknownHost: ...
Response Code    503 Error


Charles Error Report
Name lookup failed for remote host
Charles failed to resolve the name of the remote host into an IP address. Check that the URL is correct.

The actual exception reported was:

java.net.UnknownHostException: pre-api-app.youyan.meitu.com
Charles Proxy, https://www.charlesproxy.com/

解决方案:

将手机上“已安装证书”中的 Charles 证书删除,并用之前下载到手机上的证书文件重新安装一次(无需重新下载)。

如果重新安装后由 503 错误变成了 404 错误,等一分钟左右再尝试请求接口,就可以正常抓到包了。

问题 6:前一秒还能抓包,后一秒突然抓不到了

重启 Charles 后就好使了,具体原因暂不清楚。

问题 7:Charels 可以显示其它 App 的接口请求,却不能显示自己 App 的

杀死进程,重启 App 后就可以了。

问题 8:400 Bad Request

我是在开启 Charles 的情况下,电脑又连接了一下代理,把代理关闭后会提示 400 Bad Request。

解决方案:重启 Charles。

问题 9:Android 手机下载证书文件时提示下载失败

打开 PC 端浏览器在地址栏输入 chls.pro/ssl,等下载完后再手动将文件拷贝到手机。

可能你的 Charles 默认不会代理 PC 端网络请求,需要点击以下菜单勾选,等用完后你可以再点击该项取消勾选。

​​​​​​​ 

五、参考文献

  1. Charles抓包https
  2. Android7.0及以上charles抓包提示证书无效的解决方法
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐