Charles SSL证书配置后iOS设备请求显示证书错误怎么办?
在用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”,是不是哪里漏配了?
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风格:
但如果只是测试抓包的话,代码本身问题不大。重点还是回到证书信任问题上。有时候iOS设备上的时间如果不准,也会导致证书验证失败,记得检查一下设备时间是否自动同步。