使用 ACME CNAME 模式申请 SSL/TLS 证书
适用场景:
- 不方便或不愿意开放 HTTP 接口进行域名验证
- DNS 服务商不支持自动 API 修改 TXT(但支持添加 CNAME)
- 想集中管理多个站点的 DNS 验证信息
- 子域名较多,适合用统一验证子域简化配置
- 域名的 DNS TTL 设置过长(如 1800s 甚至更高),导致 TXT 解析缓存难以及时刷新,不适合频繁变动的 TXT 验证;
一、什么是 ACME CNAME 验证模式?
在 ACME 协议中,申请 SSL/TLS 证书需要验证你对某个域名拥有控制权。DNS-01 验证方式要求你在域名的 DNS 配置中添加一个 TXT 记录,例如:
对于 example.com,ACME 服务会要求你添加一条 TXT 记录到:
_acme-challenge.example.com
有些时候 DNS 服务商不支持自动操作 TXT 记录,但支持配置 CNAME。这时就可以使用 ACME 的 CNAME 模式,让 验证记录 (_acme-challenge.domain.com) 指向另一个域名(你更容易控制的域),从而实现验证。
通过这种方式,你可以集中或统一管理多个域名验证所需的 TXT 记录,非常适合多个网站部署或自动化场景。
二、术语说明
术语 | 说明 |
---|---|
域名 | 你要申请证书的目标地址,例如 example.com、www.example.com 等 |
_acme-challenge | ACME 协议要求使用的 TXT 记录前缀,验证所有权 |
CNAME | DNS 中将一个记录重定向到另一个名称(域名)的机制 |
验证域/统一域 | 你负责添加最终 TXT 值的管理域名,例如 verify.example.org |
ACME 客户端 | 可是平台内置的申请程序(如 Lucky 内置的证书系统、Caddy 等) |
三、准备工作
- 自己拥有域名并能修改其 DNS 记录(TXT 或 CNAME)
- 拥有一个用于集中管理 TXT 验证记录的“统一验证域名”,如 verify.example.org
- 使用支持 ACME 协议的运行环境(如 Lucky、Caddy、Traefik 或自建系统)
- 已开启 ACME(Let’s Encrypt 或 ZeroSSL)作为证书颁发方式
四、配置流程概览
✅ 第一步:确定你要申请哪些(子)域名
✅ 第二步:为这些域名添加 _acme-challenge 的 CNAME 到你控制的验证域名
✅ 第三步:在验证域名上添加 TXT 值(ACME 系统负责)
✅ 第四步:运行平台自动挑战(Challenge)、申请并签发证书
五、配置示例(子域名也在内)
假设:
你要申请以下域名:
- example.com
- www.example.com
- api.example.com
你有一个控制的统一域名 verify.example.org,用来集中处理 TXT 验证记录
那么,需要配置 DNS CNAME 如下:
域名(你要验证的) | DNS 记录名称(需添加) | 类型 | 值(指向的统一域) |
---|---|---|---|
example.com | _acme-challenge.example.com | CNAME | _acme-challenge.example.verify.example.org |
www.example.com | _acme-challenge.www.example.com | CNAME | _acme-challenge.www.verify.example.org |
api.example.com | _acme-challenge.api.example.com | CNAME | _acme-challenge.api.verify.example.org |
📝 小贴士:
- 即使是子域名,也要设置完整的 “_acme-challenge.子域名.主域名”
- 每个子域对应独立的验证记录
- 所有指向 verify.example.org 的记录,都汇总到你控制的域下
- 不同域名CNAME指向的目标域可以是同一个,只要不是主域名就行。
- 少量域名,可以共用一个验证目标(“shared” 形式)
- 多个域名,同时申请时,请为每个配置独立的验证记录(如 _acme-challenge.www.verify.com、_acme-challenge.api.verify.com 等)
六、Lucky 平台中的操作说明(适配其他 ACME 系统也适用)
Lucky 是一个现代的服务框架,内置支持 ACME 协议签发证书。在 DNS CNAME验证模式下,你只需完成以下三步。
① 在你的 DNS 系统中完成 CNAME 记录配置(参考上表)
② 在 Lucky 的系统中配置启用 TLS 并启用 ACME/CNAME 模式
③ Lucky 会自动发起 ACME 请求并向验证域设置 TXT 记录
关键的是:
- Lucky 会尝试在 verify.example.org 这个你控制的域下写入 TXT 值
- 验证服务通过原域名的 CNAME 查询跳转,可以正确读取验证值
- 无需每次添加 TXT,Lucky 自动管理续期过程
- 域名解析托管商信息填写的是 verify.com对应的。
—
七、统一验证域 verify.example.org 的配置建议
为了平台能自动写入 TXT(即 verify.example.org 下的记录),你可选以下几种方式管理该域名:
方式一:由你自己手动维护 TXT(不推荐)
方式二:此域名使用 DNS 服务商的 API,供平台(如 Lucky)自动添加
方式三:集成到自动化工作流,例如后台配合脚本修改记录(如 DDNS)
—
八、验证&证书签发
📌 检查 DNS 是否生效(使用 dig 或 nslookup)
示例命令:
dig -t CNAME _acme-challenge.www.example.com dig -t TXT _acme-challenge.www.verify.example.org
确保:
- CNAME 能正确返回验证域名地址
- 在申请过程中 TXT 被自动写入验证域名
Lucky / 其他平台会检测 TXT 状态,完成 ACME 验证并签发证书。
—
九、证书续期
证书有效期通常为 90 天。Lucky 和大多数支持 ACME 的平台会自动在证书到期前完成一次 ACME 验证并续签新证书。
通过 CNAME 模式,一旦验证成功并配置稳定,不需频繁人工干预,自动续期将持续工作。
—
十、常见问题答疑
Q1:我是否要为每个子域都设置 CNAME?
是的,验证记录与域名一一对应,因此每个域名或者子域名都需要设置一个对应的 CNAME 指向(统一验证域)
Q2:我是否需要在 verify.example.org 下提前设置 TXT?
不需要。如果平台支持自动写入 TXT(如 Lucky、Caddy 等),它们会在验证流程中自动添加和移除验证值。
Q3:我的 DNS 服务商系统是不是必须支持高级功能?
只要支持添加 CNAME 和 TXT 记录就可以。不需要 API,但使用 API 可实现真正的自动化。
Q4:如何排查 DNS 生效?
使用 dig、nslookup 查询 CNAME 和 TXT 记录是否正确。
—
十一、小结
ACME 的 CNAME 验证方式的优点:
- 安全:无需暴露 Web 服务端口
- 自动化:配合 API 可实现证书自动签发与续期
- 易管理:子域多时集中管理验证记录
- 灵活:跨域集中进行 DNS 控制验证
它特别适合使用平台如 Lucky、Caddy、Traefik 等已内置 ACME 支持场景。
—
十二、结语
通过本文你已经掌握如何使用 ACME CNAME 模式来安全、高效地申请 SSL/TLS 证书,无需依赖 acme.sh 或特定客户端,也适合架设在支持 ACME 协议的平台中。这个方式特别适合需要集中 DNS 管理、拥有多个域名或子域的用户,让证书申请和续期更加自动化、安全、可控。