广告位 · 页头(后台-模块管理-新建模块后替换此区域)

iOS端如何用Charles抓包并解密HTTPS?证书安装、手机代理配置及SSL Proxying设置详解

HTTPS抓包并不能靠简单的代理转发直接看到明文,Charles能解密HTTPS的前提是在客户端与目标服务器之间完成一次完整的中间人代理协商。如果只把iPhone的Wi-Fi代理指向电脑,Charles列表中往往只会出现CONNECT隧道请求,看不到具体的URL、请求头或响应体。出现这种情况并不是代理没生效,而是根证书和SSL Proxying这两个关键配置没有闭合。下面围绕证书安装、手机代理配置、SSL Proxying设置三个环节,把iOS端抓包解密的完整路径拆开说明。

iOS端如何用Charles抓包并解密HTTPS?证书安装、手机代理配置及SSL Proxying设置详解

一、Charles抓包与HTTPS解密的工作机制

把Charles理解为普通HTTP代理时,客户端发送请求会先到达Charles,再由Charles转发给目标服务器。对于未加密的HTTP流量,Charles可以直接查看请求行、头部和响应体,这也是很多接口调试的基础。但HTTPS流量在传输之前会进行TLS握手,客户端与服务器协商出会话密钥,后续数据都被加密,代理无法直接读取内容。这时如果只是简单转发,Charles只能看到一条CONNECT请求,里面是目标主机和端口,看不到实际访问的路径。

Charles要解密HTTPS,采用的是中间人代理模式。Charles对客户端伪装成目标服务器,把自己签发的证书返回给客户端;对目标服务器则伪装成客户端,建立另一条独立的TLS连接。客户端与Charles之间、Charles与服务器之间各有一条加密通道,Charles处在中间可以同时解密两端的数据。这个方案成立的核心条件是客户端必须信任Charles根证书,否则TLS握手阶段就会报证书不受信任。另一个条件是必须明确告诉Charles哪些域名需要解密,也就是开启SSL Proxying,否则Charles默认只会透传隧道。

因此完整的解密链路包含三个步骤:电脑端Charles正常运行并监听代理端口,iPhone安装并完全信任Charles根证书,最后在Charles中为指定域名打开SSL Proxying。漏掉任意一个环节,要么手机无法上网,要么HTTPS请求显示为无法解密的CONNECT隧道。

二、在iPhone上安装并信任Charles根证书

先确认电脑上的Charles已经启动,并且iPhone与电脑连接在同一个Wi-Fi网络下。iPhone打开Safari,访问chls.pro/ssl,页面会自动弹出描述文件下载提示。这个地址是Charles官方提供的证书下载入口,电脑端也可以从Charles菜单Help、SSL Proxying、Install Charles Root Certificate on a Mobile Device中看到对应提示。下载完成后进入iPhone的设置,顶部会出现已下载描述文件,点击进入并选择安装,需要输入锁屏密码确认。

描述文件安装成功并不代表证书已经被系统信任,iOS对根证书有额外的信任开关。继续进入设置、通用、关于本机、证书信任设置,在针对根证书启用完全信任一栏中找到Charles Proxy CA,将其开关打开。这一步是最容易漏掉的地方,很多开发者装完描述文件后发现HTTPS仍然报错,就是因为没有在证书信任设置中手动开启完全信任。开启后建议关闭并重新打开Safari,再访问任意HTTPS网站验证是否还会出现证书警告。

如果之前安装过旧版本Charles证书,建议先删除旧的描述文件再重新安装,避免多个证书叠加导致选择混乱。Charles证书默认有有效期,到期后需要重复上述步骤更新证书。对于已经开启完全信任的证书,iOS会在证书到期后自动停止信任,抓包时会出现握手失败,此时检查证书有效期可以快速定位问题。

三、配置iPhone代理指向电脑上的Charles

电脑端需要先确定两个信息:局域网IP地址和Charles代理端口。Charles默认HTTP代理端口为8888,可以在Proxy菜单下的Proxy Settings中查看或修改。电脑IP在Mac上可以通过系统偏好设置或终端命令ifconfig查看,Windows系统使用ipconfig命令查看。iPhone和电脑必须处于同一局域网,并且路由器没有开启AP隔离,否则即使IP和端口正确也无法建立连接。

iPhone上进入设置、无线局域网,点击当前连接Wi-Fi右侧的详细信息图标,在网络设置中选择配置代理,切换为手动模式。服务器一栏填写电脑的局域网IP,端口填写8888。填完后返回,iPhone的流量就会先发送到电脑上的Charles。首次配置代理后,在iPhone上任意访问一个网页,Charles界面会弹出连接请求提示,选择Allow允许该设备连接。如果Charles没有弹出提示,检查电脑防火墙是否拦截了8888端口,或iPhone是否与电脑处于同一网段。

代理设置完成后,iPhone上大部分网络请求都会经过Charles,包括系统服务、App请求和网页浏览。如果发现手机无法上网,可以先关闭代理恢复直连,确认网络本身没有异常,再排查代理IP和端口是否填错。Charles的HTTP代理只负责HTTP和HTTPS流量,部分不走系统代理的应用需要单独配置或使用其他抓包方案。

四、开启SSL Proxying并验证HTTPS解密

证书安装和代理配置只是让Charles能够接收流量,但要解密HTTPS还要在Charles中开启SSL Proxying。打开Charles菜单Proxy、SSL Proxying Settings,勾选Enable SSL Proxying。在Locations列表点击Add,Host可以填写星号表示所有域名,Port填写443。如果只想针对特定域名解密,可以填写api.ipipp.com这样的具体地址,避免无关域名产生过多证书告警。配置保存后,之前已经建立的连接需要重新发起才能生效。

重新在iPhone上访问HTTPS接口或网页,Charles会针对目标域名弹出新的证书提示,Allow之后即可看到明文请求。此时列表里不再只有CONNECT隧道,而是出现完整的GET或POST请求,请求头、响应体以及JSON数据都可以直接查看。为了确认整条链路是否通畅,可以在电脑上用命令行验证代理和SSL解密是否正常。

# 通过Charles代理发起HTTPS请求,-x指定代理地址和端口,-k忽略证书告警便于测试
curl -x http://192.168.1.100:8888 https://api.github.com/zen -vk

命令执行后如果能在Charles中看到对应请求和明文响应,说明代理转发与HTTPS解密已经生效。如果仍然显示加密数据或握手失败,优先检查证书是否在证书信任设置中开启了完全信任,其次确认SSL Proxying的Host和Port是否匹配目标域名。部分App使用了SSL Pinning技术,即使安装并信任证书也无法解密,这种场景需要借助越狱或Frida等动态插桩工具绕过证书校验,不属于Charles本身的配置范围。

对于不需要解密的流量,可以在SSL Proxying Settings中排除特定域名,减少证书提示和性能开销。测试完成后建议移除iPhone上的代理配置,并在证书信任设置中关闭Charles证书信任,避免长期开启代理导致流量被第三方截获的风险。Charles适合本地开发调试,生产设备上不建议长期保留抓包环境。

广告位 · 文章底部(后台-模块管理替换此区域)