☰
Caddy 开启加密客户端问候:从最小配置到自动轮换的完整指南
2026/11/3 18:44:42 网站建设 项目流程

Caddy 开启加密客户端问候:从最小配置到自动轮换的完整指南

【免费下载链接】caddyFast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS项目地址: https://gitcode.com/GitHub_Trending/ca/caddy

每次访问一个网站,浏览器在 TLS 握手阶段都会把要访问的域名明文发出去——加密的只有内容,没加密的是"你在访问谁"。同网段的人或运营商,靠这一点就能列出你访问过的站点。Caddy 的加密客户端问候(Encrypted Client Hello,下文简称 ECH)功能,就是用来堵住这最后一个明文的。

它解决什么:域名不再裸奔

ECH 的定位一句话:把写着真实域名的内层 ClientHello 加密,外面套一层使用通用公共域名的外层 ClientHello。

打个比方,就像寄信:信封外面写的是一个统一的公共信箱地址,具体寄给谁只有你和收件人知道。

  • 启用前:网络侧能直接看到你访问的是shop.example.com还是blog.example.com
  • 启用后:网络侧只看到ech.example.com这一个公共名

真实域名从"默认暴露"变成"默认隐藏",这是行为上的本质差异。

一行 ech 全局选项:最小可运行配置

Caddyfile 里启用 ECH 只需要一个全局选项:

{ ech ech.example.com } shop.example.com api.example.com

ech选项的参数就是公共域名(public name)。Caddy 会用它自动生成 ECH 配置,并自动为该名字申请一张证书。上面这个例子已经可以跑起来,但客户端要实际用上 ECH,还得能"找到"配置,这就涉及发布。

JSON 配置里只有两个核心字段:

字段作用默认值
encrypted_client_hello.configs[].public_name外层 ClientHello 使用的公共域名必填,至少一个
TLS 应用的全局dns发布 ECH 配置用的 DNS 服务商空,不发布

两个可选做法一句话带过:在ech块内写dns 服务商 参数可以单独指定发布用的 DNS 服务商;或者在全局选项里直接配dns,ECH 会默认用它发布。注意:使用哪个具体的 DNS 服务商模块,都需要用包含该模块的自定义编译版本。

不配任何发布渠道,ECH 服务端依然工作,但大多数客户端不会主动启用——它们查不到配置。换句话说,最小配置是"能跑",发布配置才是"被用上"。

密钥 30 天轮换、90 天清理:背后机制

三个要点,都对应 ECH 实现源码 中的实际逻辑:

1. 自动生成与持久化首次启动时,Caddy 生成一组 X25519 密钥对,私钥、配置、元数据分别存进自己的持久化存储,每份配置有独立编号。加载时若发现某份配置损坏,会自动清掉重建,不影响服务。

2. 自动轮换后台任务每小时检查一次。密钥满 30 天就生成新的,并标记旧的为"已被替换";被替换的密钥满 90 天后彻底删除。过渡期内新旧密钥并存,客户端不会断。

3. 发布到 DNS 记录发布时,Caddy 把配置写入目标域名的 HTTPS 类型 DNS 记录(TTL 5 分钟,优先级 2),并记录发布历史避免重复写。默认发布对象是 Caddy 已注册的所有 HTTPS 站点域名,不需要你逐个列。

Caddyfile 的ech选项解析逻辑在 Caddyfile 解析源码,想了解行为细节可以从这两个文件入手。

适合谁、不适合谁:适用边界

适合:

  • 同一台服务器跑多个子域名,想减少暴露的域名数量
  • 访问者普遍使用 DoH/DoT 的现代浏览器用户群

不适合或有条件:

  • 公共域名不归你控制、或 DNS 不指向本服务器——拿不到证书时,客户端可能被"逼"着明文暴露真实域名,隐私反而变差
  • On-Demand TLS 场景:Caddy 在握手时才知道要服务哪个域名,发布 DNS 记录已经晚了,这类域名必须在 JSON 的domains字段里显式列出
  • 老客户端:只有支持从 DNS 读 ECH 配置的浏览器才会真正启用,其余流量仍是明文 SNI
  • 源码中明确标注该功能处于实验阶段(EXPERIMENTAL),配置结构可能变动;另外 ECH 会把相关连接策略的最低 TLS 版本自动抬到 1.3

避坑与检查清单

  • 确认公共域名的 DNS 指向本服务器、证书已成功签发,检查 Caddy 日志中 ECH 相关报错
  • 看日志里的发布记录:成功会有 "successfully published ECH configuration list",失败会按域名逐条打印
  • 若某域名本身是 CNAME 记录、或尚无任何 DNS 记录,Caddy 会跳过发布,需手动处理
  • 公共名数量保持最少:名字越多,匿名集越小,保护效果越弱
  • 升级 Caddy 前留意 ECH 配置字段是否随实验版本变化

ECH 让真实域名成为 TLS 握手中第一件不再默认裸奔的东西:密钥生成、轮换、DNS 发布全部由 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询