第二个更重要:iOS 上即使显示“已验证”,如果 Charles 的根证书没安装到 “系统”层级,HTTPS 握手还是会失败。你得重新导出 Charles 根证书(Help → SSL Proxying → Save Charles Root Certificate),然后通过 Safari 打开这个证书文件安装,安装时选择“系统”层级(不是“用户”),之后在“设置 → 通用 → VPN与设备管理”里找到 Charles 根证书,点进去点“完全信任”。
做完这两步重启下 Charles 和手机(不是重启 App),再试。要是还不行,检查下 Charles 的 SSL 解密设置里有没有勾选“Record SSL Proxying”,有时候默认是关的。
常见的解决方案有这几个关键点:
第一,iOS 16的证书信任有两层。你说的"已验证"只是在设置-通用-关于本机-证书信任设置里安装了,但还需要进去那个页面,把Charles证书的开关手动打开,变成绿色才是真正信任。很多人卡在这一步。
第二,Charles的SSL Proxying Settings配置。去Proxy菜单下的SSL Proxying Settings,确保勾选Enable SSL Proxying,然后添加一条规则,Host填,Port填443或者。你虽然加了:,但建议删掉重新加一条,有时候这个配置会抽风。
第三,检查一下你报错的那个具体host。右键点击请求记录里那个失败的请求,看看有没有"Enable SSL Proxying"选项,如果有的话点一下手动开启。
第四,如果上面都对了还是不行,可能是App做了SSL Pinning(证书绑定)。这种情况只能hook绕过或者用其他工具,Charles本身搞不定。
顺便说下,iOS 16.4之后有些系统级别的请求可能还是抓不到,但第三方App一般没问题。
你先检查第一点,那个开关很多人漏掉。
第一个是 Charles 的 SSL Proxying 设置要生效,你加了
*:*规则是对的,但得确认这个规则是 Enable SSL Proxying 后加进去的,而且规则里端口要写成:443或者保留通配,比如*:443,不能只写*:*,有些版本会忽略非 443 的端口。第二个更重要:iOS 上即使显示“已验证”,如果 Charles 的根证书没安装到 “系统”层级,HTTPS 握手还是会失败。你得重新导出 Charles 根证书(Help → SSL Proxying → Save Charles Root Certificate),然后通过 Safari 打开这个证书文件安装,安装时选择“系统”层级(不是“用户”),之后在“设置 → 通用 → VPN与设备管理”里找到 Charles 根证书,点进去点“完全信任”。
做完这两步重启下 Charles 和手机(不是重启 App),再试。要是还不行,检查下 Charles 的 SSL 解密设置里有没有勾选“Record SSL Proxying”,有时候默认是关的。
顺带提醒一句,生产环境别这么抓包,别把证书装在主力机上,尤其别信陌生来源的根证书,真要长期用建议搞个测试机或者模拟器。