Charles抓包HTTPS时证书安装后还是无法解密?

Prog.新红 阅读 6

我用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、重装证书、清除浏览器缓存都没用,到底漏了哪一步?

我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
❤诗晴
❤诗晴 Lv1
这个问题我遇到过,主要两个坑:

第一个,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环境变量里禁用证书验证(仅开发环境):

// 在发起请求前设置
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

// 或者用fetch时忽略证书(不推荐生产环境)
const agent = new https.Agent({
rejectUnauthorized: false
});
fetch('https://api.mydev.local/user/profile', {
agent,
// ...
})


或者更直接的办法:让你的开发服务器也用Charles的代理,或者把本地自签名证书换成Charles签的证书。

还有个容易漏的:确认Charles的代理端口开了,浏览器或系统代理是否真的指向了Charles。
点赞
2026-03-13 21:06