Caddy 3 步快速开启 ECH,把真实域名藏进 TLS 握手
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
用户访问 Caddy 托管的站点时,会在连接的第一时刻把域名明文广播给全网。ECH(Encrypted Client Hello,加密客户端问候)就是用来藏住这条信息的:Caddy 自 v2.6 起在 TLS 模块里内置了它,默认替访客守住访问足迹。
什么场景下你的域名是裸露的
HTTPS 虽然加密了内容,但连接开头有一句话是明文的:浏览器先告诉服务器“我要访问哪个域名”,这句话叫 SNI(Server Name Indication,服务器名称指示)。线路上的运营商、公司网关、公共 Wi-Fi 经营者都能顺手记下它,攒够一段时间,就能拼出一份相当准确的“某人在哪些日子访问过哪些站”的清单。
🔍 打个比方:就像住店客人在前台当着大堂所有人的面报房间号。ECH 改成了客人只说一句“我有预订码”,真正的房间号只有客人和前台两个角色看得到。
下面这几类人,通常很在意这句话:
- 重视访问隐私的普通用户;
- 站点属性敏感(媒体、医疗、内部系统入口)的运营者;
- 不想让服务拓扑被外部流量分析探测出来的人。
Caddy ECH 到底做了什么
机制三句话能说完:
- 服务器端先生成一对 X25519 密钥(一种用来协商共享密钥的算法),并指定一个“外层域名”(public_name,掩护用的域名)。
- 浏览器把真实的 ClientHello(建连时的第一封握手报文)加密进外壳,外壳上只写外层域名,线路上就只剩外层域名可见。
- 客户端的“预订码”从域名的 HTTPS 记录里获取(一种按 RFC 9460 定义的新 DNS 记录类型),Caddy 可以直接自动发布这条记录。
服务端的事 Caddy 也替你做完了:自动生成密钥、每 30 天轮换一次、90 天后清理旧密钥,并会自动把站点最低版本抬到 TLS 1.3(这是 ECH 的门槛)。这些逻辑都集中在 modules/caddytls/ech.go 里,可以对照着看。
Caddy ECH 开启步骤
第一步:兼容性检查
- Caddy 版本 v2.6 以上;
- 域名的 DNS 服务商支持写入 HTTPS 记录,最好让访客侧开了 DoH/DoT(加密的 DNS 查询),否则预订码可能拿不到;
- 想让 Caddy 自动发布记录,需要用
xcaddy build构建带对应 DNS 服务商插件的版本(例如xcaddy build --with github.com/caddyserver/caddy-dns/cloudflare);不想构建的话,也可以自己手动把 HTTPS 记录写好; - 浏览器侧,Chrome 112、Firefox 113、Edge 112 及更新版本都支持。
第二步:写最小配置 ⚙️
在 Caddyfile 的全局块里加一段ech选项,参数就是外层域名:
{ ech public.example.com { dns cloudflare { token {env.CF_TOKEN} } } }外层域名必须能解析到你这台服务器,Caddy 会为它申请一张证书(只用于握手,不承载业务流量)。这段选项的解析逻辑在 caddyconfig/httpcaddyfile/options.go。
第三步:验证发布与握手 ✅
先用dig +short HTTPS 你的域名确认记录里出现了ech参数,再打开浏览器的chrome://net-internals/#ech页面,看握手是否走了加密路径。两处都通过,就算上线了。
ECH 排查清单
🧯 按“现象 → 处理”来对:
- HTTPS 记录没出现→ 查 Caddy 日志里 “failed to publish ECH configuration” 相关报错。常见原因是构建里没带 DNS 服务商插件、API 密钥无效;另外域名如果挂着 CNAME 记录,Caddy 会主动跳过不发布。
- 记录有了,浏览器却不用 ECH→ 多半是访客侧 DNS 未加密(没走 DoH/DoT),配置可能被篡改或没取到;也可能是浏览器版本低于支持线。
- 外层域名申请证书失败→ public_name 没解析到本服务器,这个必须修。否则客户端可能退回明文 SNI,隐私反而丢了。
- 部分连接仍是明文→ 属正常现象。不支持 ECH 的客户端照走原来的 TLS 通道,可用性不受影响。
值不值得上
适合:在意访问隐私的用户、敏感属性站点的运营者、想躲开流量分析的企业入口。 不适合:纯内网或 IP 直连、没有可写 API 的 DNS 服务商、对 SNI 暴露毫不在意的场景。 代价:源码里仍标着 EXPERIMENTAL,配置结构可能调整;外层域名要多养一张证书;访客侧 DNS 未加密时拿不到任何收益。 性能上开销很小,握手延迟增加在毫秒量级,基本不构成取舍理由。
回到大堂
再回到开头那家酒店:ECH 生效后,前台记录的名单上只剩“预订码”这一种通用说法,客人实际进了哪间房,只有客人和前台知道。你的站点域名不再是当着大堂所有人喊出来的话,而是只有双方共享的一个编号。如果你在用 Caddy、又能管理域名的 DNS,这三步现在就可以走完。
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考