使用Charles Proxy将HTTPS服务器请求映射至本地HTTP服务失败求助
我之前也踩过一模一样的坑——想用Charles的Map Remote把HTTPS的my-server.com转发到本地HTTP服务localhost:PORT,结果HTTP访问完全正常,HTTPS就报CONNECT请求错误,Chrome、iOS模拟器和Postman全翻车。其实这不是Map Remote功能本身的问题,是Charles处理HTTPS请求时需要额外的证书和规则配置,下面是我亲测有效的完整步骤:
一、Charles端核心配置调整
1. 开启SSL代理并安装根证书
这是处理HTTPS请求的基础,没配置的话Charles根本没法解密HTTPS流量:
- 打开Charles,顶部菜单选
Proxy > SSL Proxying Settings - 勾选
Enable SSL Proxying,然后在Include列表里添加my-server.com:443(精确匹配比*:443更安全,避免拦截不必要的域名) - 安装根证书:
- 走
Help > SSL Proxying > Install Charles Root Certificate,把证书加到Mac钥匙串后,一定要右键证书选显示简介,把信任选项改成始终信任 - iOS模拟器的话,打开模拟器访问
http://chls.pro/ssl下载证书,然后去设置里找到这个证书并信任;Chrome和Postman会自动用系统信任的证书,所以Mac端信任后就不用单独设置了
- 走
2. 修正Map Remote规则的细节
很多人在这里踩坑,规则的Protocol一定要选对:
- 打开
Tools > Map Remote编辑你的规则:- Source区域:Protocol选
HTTPS,Host填my-server.com,Port填443,Path填* - Destination区域:Protocol选
HTTP,Host填localhost,Port填你的本地服务端口PORT,Path填* - 重点:Source的Protocol必须是HTTPS,不然Charles识别不到这是要拦截的HTTPS请求,直接把CONNECT请求发去真实服务器了
- Source区域:Protocol选
3. 关闭"仅为包含的站点启用SSL代理"(可选但推荐)
在SSL Proxying Settings里取消勾选这个选项,这样Charles会处理所有HTTPS的CONNECT请求,避免因为规则匹配遗漏导致的问题
二、Mac系统端辅助配置
1. 确保系统代理指向Charles
让系统所有流量都走Charles,这样各个客户端才会把请求发给Charles处理:
- 打开Mac的
系统设置 > 网络 > 高级 > 代理 - 勾选
Web代理(HTTP)和安全Web代理(HTTPS),服务器填127.0.0.1,端口填Charles默认的8888(如果你改了Charles的代理端口就填对应值) - 点击
好并应用设置
2. 排除本地服务的代理环路(关键)
Charles默认会拦截本地到localhost的请求,容易出现循环代理问题:
- 顶部菜单选
Proxy > Proxy Settings,在Exclude列表里添加localhost:PORT(你的本地服务端口),这样Charles就不会拦截本地服务的请求,映射时就不会出循环问题
三、各客户端的验证设置
- Chrome:去
chrome://settings/system勾选使用系统代理设置,别让Chrome用自己独立的代理 - iOS模拟器:重启一下模拟器,确保它加载了新的代理和证书配置
- Postman:在设置里选
使用系统代理,或者手动把代理设为127.0.0.1:8888
为啥之前会出CONNECT错误?
当你访问HTTPS的my-server.com时,浏览器首先会发一个CONNECT请求给Charles,要求建立到my-server.com:443的加密隧道。如果Charles没配置好SSL代理,或者Map Remote规则的Source协议没选HTTPS,Charles就会把这个CONNECT请求直接转发到真实的my-server.com,而不是映射到你的本地服务,自然就报错了。
按照上面的步骤配置完,Charles会正确拦截CONNECT请求,解密后续的HTTPS流量并转发到你的本地HTTP服务,这样Map Remote就能正常工作,完全不用依赖Rewrite这种临时方案。
内容的提问来源于stack exchange,提问作者gutte

