自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选

HTTP-01 和 DNS-01 都能拿到 Let's Encrypt 证书,但在自动化续期、通配符证书和负载均衡后端环境里,两者的坑完全不同。本文按实际部署场景拆解取舍,帮你选出能在凌晨两点不出事的那个。

本文目录
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选

凌晨三点的告警很常见:证书过期了,可续期脚本明明"一直在跑"。排查下来,十有八九是验证方式选错了——当时图省事用了 HTTP-01,后来架构变了,80 端口的路由被某次改动悄悄截断,续期就一直静默失败。

HTTP-01 和 DNS-01 在 CA 眼里是平等的,拿到的证书一模一样。区别只在"你怎么证明域名归你",而这个区别决定了自动化场景下的可靠性。

HTTP-01:简单,但依赖 HTTP 路径完好

自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:DNS ownership verification using a delegated CNAME, shown as a precise handoff between two controlled zones
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:DNS ownership verification using a delegated CNAME, shown as a precise handoff between two controlled zones查看原图

CA 会访问 http://域名/.well-known/acme-challenge/xxx,你的客户端把对应内容放在那里即可。配置直观,调试也容易——curl 一把就知道通不通。

但它有几个硬性前提:

  • 80 端口必须能从公网直达,且请求能落到跑 ACME 客户端的那台机器。
  • 通配符证书(*.example.com)不支持 HTTP-01,这是协议层面的限制,不是 CA 的政策问题。
  • 多机负载均衡环境下,CA 的请求可能落到任意一台后端。要么所有机器都能应答同一个 challenge(共享存储或代理转发),要么把 /.well-known/acme-challenge/ 统一反代到一台固定机器。很多"时好时坏"的续期失败就是这么来的:请求偶尔落到配置过的那台,偶尔不落。

如果你的架构就是单台 Nginx 加一个域名,HTTP-01 完全够用,没必要折腾 DNS。

自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:an ACME request being validated at separate stations and turned into a new deployable artifact while private key material remains at its origin
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:an ACME request being validated at separate stations and turned into a new deployable artifact while private key material remains at its origin查看原图

DNS-01:麻烦一次,省心很久

DNS-01 要求你在域名下创建一条 _acme-challenge.域名 的 TXT 记录。CA 查 DNS 来验证,不碰你的 Web 服务。

代价是要接 DNS 服务商的 API,凭据要妥善保管。换来的是:

  • 唯一能签通配符证书的方式。
  • 不依赖 80 端口、不依赖 Web 架构,后端怎么扩容、怎么换都不影响续期。
  • 服务在内网、没有公网入口时也能签——只要 DNS 在公网解析就行。
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:a new certificate version moving from its source to several edge appliances while the previous working version remains ready for rollback
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:a new certificate version moving from its source to several edge appliances while the previous working version remains ready for rollback查看原图

一个小坑:TXT 记录生效有传播延迟,客户端通常要等几秒到几十秒再去触发 CA 校验。还有,别为了图方便把主域 DNS 的 API 凭据(能改所有记录的那种)直接塞进每台服务器。更稳妥的做法是单独建一个 _acme-challenge.example.com 的 CNAME,指向一个专门用于验证的子域或独立 DNS 账户,凭据权限就小得多。

按场景对号

  • 单机、少数几个具体域名、80 端口稳定可达:HTTP-01,简单就是优势。
  • 需要通配符:DNS-01,没得选。
  • 负载均衡多后端:DNS-01。HTTP-01 也能做,但要额外维护 challenge 的统一路由,长期看是债。
  • 内网服务、CDN 回源、80 端口被占用或封闭:DNS-01。
  • DNS 服务商没有 API、也不支持 CNAME 委托:这种情况下 HTTP-01 反而更现实,或者考虑换 DNS 托管。

一句话判断标准:验证路径上任何一个环节变了,续期会不会悄悄挂掉?会的那条路,迟早会在凌晨找你。

自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:an approaching certificate expiry being detected early, followed by a fresh request and a safe replacement before the live connection is interrupted
自动化续期场景下,HTTP-01 和 DNS-01 到底怎么选:an approaching certificate expiry being detected early, followed by a fresh request and a safe replacement before the live connection is interrupted查看原图

在 CertbotX 中实践

CertbotX 的 DNS-01 流程支持 CNAME 委托:把 _acme-challenge 记录指向专门的验证域,主域 DNS 凭据就不用下放到服务器。签发后由 ACME 自动管理到期前重新签发,证书可直接部署到 Agent、EdgeOne 或其他 CDN,每次部署有记录可查,出了问题能回溯是哪次续期、发到了哪里。对多后端或内网服务这类 HTTP-01 容易翻车的场景,这条链路基本不需要人工介入。

核验参考

← 返回资讯中心