Charles SSL证书配置后iOS设备请求显示证书错误怎么办?

希玲 阅读 66

在用Charles抓iOS设备的HTTPS请求时,虽然已经在设置里启用了SSL Proxy并信任了Charles证书,但每次请求都弹出”证书无效”的错误。之前测试HTTP请求没问题,换成HTTPS就报错,这是什么情况啊?

我尝试过在手机设置里多次信任证书,还重新生成过SSL证书,Charles里也给对应域名(api.example.com)勾选了Allow SSL Proxying。代码是这样的:

fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) throw new Error('Network response error');
    return response.json();
  })
  .catch(error => console.log('抓包失败:', error));

手机和电脑用同一个WiFi,端口4321也没问题。但Charles日志里始终显示”Connection reset by peer”,是不是哪里漏配了?

我来解答 赞 8 收藏
二维码
手机扫码查看
1 条解答
公孙文博
这种情况很可能是iOS系统对SSL证书链验证比较严格导致的。你可以按下面几个步骤检查:

1. 检查Charles根证书是否被正确信任。iOS设备设置里不仅要信任证书,还要确保证书被标记为"始终信任"。

2. 关键点:iOS 10.3+引入了App Transport Security (ATS),会强制校验证书有效性。即使你信任了Charles的证书,它还是会验证证书链。可以尝试在Charles里开启"SSL Proxying"时勾选"Use system trusted certificates"选项。

3. 如果你要抓取的域名是像api.example.com这种子域名,建议设置SSL Proxying规则时使用*.example.com来匹配所有子域名。

4. Charles版本要保持最新,旧版本可能存在证书兼容性问题。

关于代码本身,其实可以优化成更优雅的async/await风格:

async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) throw new Error('Network response error');
return await response.json();
} catch (error) {
console.log('抓包失败:', error);
throw error;
}
}


但如果只是测试抓包的话,代码本身问题不大。重点还是回到证书信任问题上。有时候iOS设备上的时间如果不准,也会导致证书验证失败,记得检查一下设备时间是否自动同步。
点赞 6
2026-02-04 13:00