Charles抓包HTTPS时证书安装后还是无法解密?
我用Charles抓自己开发的React项目接口,已经按教程在手机和电脑上都装了Charles的根证书,也开启了SSL Proxying,但HTTPS请求还是显示“SSL Proxying not enabled for this host”,根本看不到明文内容。明明域名也加到SSL Proxying列表里了啊!
前端代码是这样发请求的:
fetch('https://api.mydev.local/user/profile', {
method: 'GET',
headers: {
'Authorization': 'Bearer ' + token
}
})
.then(res => res.json())
.then(data => console.log(data));
本地开发用的是自签名证书,会不会跟这个冲突?试过重启Charles、重装证书、清除浏览器缓存都没用,到底漏了哪一步?
第一个,SSL Proxying的域名格式要对。你加的可能只是
api.mydev.local,但实际请求可能是https://api.mydev.local/user/profile。进Charles的Proxy -> SSL Proxying Settings,把域名改成api.mydev.local或者直接用通配符*.mydev.local。第二个,也是你最可能踩的坑——本地自签名证书。Charles作为中间人拦截HTTPS需要建立两层SSL连接:客户端到Charles,Charles到服务器。你本地用了自签名证书,浏览器或Node.js可能直接绕过Charles跟你的服务器握手了,Charles根本插不进去。
解决思路:让你的开发环境信任Charles的证书,而不是自签名证书。
如果用的是Chrome/Edge,在地址栏点那个锁图标,看看证书是谁发的。如果是自签名证书,说明请求没走Charles。
前端开发的话,可以试试在Node环境变量里禁用证书验证(仅开发环境):
或者更直接的办法:让你的开发服务器也用Charles的代理,或者把本地自签名证书换成Charles签的证书。
还有个容易漏的:确认Charles的代理端口开了,浏览器或系统代理是否真的指向了Charles。