Caddy ECH 深入实战:配置、自动轮换与避坑完全指南
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
SNI(TLS 握手中携带目标域名的字段)会让你的真实站点名在每次连接时明文暴露。Caddy 的 ECH(Encrypted Client Hello)把客户端发出的 ClientHello 整体加密,真实域名藏进外壳里。这套 Caddy ECH 配置实战到底怎么做?拆成三层看:握手路径、配置旋钮、密钥自动生命周期。
握手里,明文 SNI 泄露了什么
哪怕你的站点已是完整 HTTPS,握手中的 SNI、ALPN 依然肉眼可见,路径上的观察者能精确判断你在访问哪个站。ECH 的思路是:外层 ClientHello 发你配置的一个"壳域名"(public name),真实请求参数放进加密后的内层,外部只能看到壳。代价有两点:你需要一个额外域名当外壳;客户端必须事先拿到 ECH 配置(公钥加参数)才能加密。后者是 ECH 能否生效的关键,也决定了它必须"发布",下面按配置层、密钥层、发布层逐层拆解。
打开 Caddy ECH:ech 全局选项怎么配
Caddyfile 里 ECH 是全局选项,由caddyconfig/httpcaddyfile/options.go中的parseOptECH解析,最终落到 tls 应用的encrypted_client_hello字段。最小可用写法(一个壳域名加一个 DNS 发布者)如下:
{ ech shared.example.com { dns cloudflare token-$CLOUDFLARE_API_TOKEN } }shared.example.com是外层 SNI,Caddy 会为该域名自动申请证书,只用于握手外壳,不承载业务流量dns子指令指定 libdns 提供商,用来把 ECH 配置写成 HTTPS 记录;省略时默认使用全局dns选项
密钥 30 天自动轮换是怎么跑的
密钥生成在modules/caddytls/ech.go的generateAndStoreECHConfig:用 X25519 密钥对生成后,连同序列化的 ECHConfig 一起写入 Caddy 存储的ech/configs/<id>/路径下(key.bin、config.bin、meta.json 三个文件)。TLS 模块随后启动后台协程,每小时检查一次轮换与发布,轮换判据是两个常量:
const ( rotationInterval = 24 * time.Hour * 30 // 30 天轮换 deleteAfter = 24 * time.Hour * 90 // 90 天清理 )- 密钥满 30 天先生成新密钥,旧的标记
Replaced后继续可用,兼容仍持旧配置的客户端 - 被标记满 90 天后从存储与内存中删除;整个流程由存储里的
ech_rotation锁保护,多实例集群不会竞态轮换
版本号与 Go 版本约束藏在哪
注意ech.go里版本号常量是draftTLSESNI25(0xfe0d),说明当前实现跟随 ECH 草案版;密钥最终以tls.EncryptedClientHelloKey形式交给 Go 标准库握手,所以要求 stdlib 已带服务端 ECH 支持(Go 1.24 起)。升级环境时先确认这两点,否则会出现配置看似生效但客户端握不上 ECH 的情况。
客户端怎么拿到密钥:DNS 自动发布
ECH结构体的Publication字段注释写明:不发布的话大多数浏览器根本不会用 ECH。实现方是ECHDNSPublisher,把 base64 编码的 ECHConfig 写进域名的 HTTPS DNS 记录ech参数,测试文件ech_dns_test.go验证了它合并时保留 alpn、ipv4hint 等既有参数。默认行为有两层:不写 publication 块时,Caddy 把所有配置经由应用级全局 dns 提供商发布;而若你根本没配置 DNS 提供商,发布逻辑直接空转,此时只能靠日志发现 ECH 没真正生效。
配置 ECH 容易踩的三个坑
- 壳域名必须是你能控制的域名:Caddy 要为它签发证书,签不到时客户端会被迫明文暴露真实域名,隐私反而更差
- 别开太多 public name:源码注释强烈建议 config 数量最少化以最大化匿名集,同服务器多个子域各挂一个壳名是最常见的误配
- 确认 DNS 提供商支持 HTTPS 记录:发布依赖 libdns 的 HTTPS 记录接口,后台发布失败只写进名为
ech的 logger,不阻塞启动
源码中ECH与ECHPublication均标注 EXPERIMENTAL,版本号跟随 draft-ietf-tls-esni 草案,后续关注其 RFC 定稿与 Go stdlib 的服务端支持稳定性。
【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考