返回资讯

comparisons

单域名小站到底用 HTTP-01 还是 DNS-01:一个经常被默认选项坑到的问题

HTTP-01 和 DNS-01 都能完成 ACME 域名验证,但在端口受限、多机部署、通配符证书等场景下取舍完全不同。本文按实际运维条件拆开比较,并说明 DNS-01 配合 CNAME 委托如何降低自动化门槛。

单域名小站到底用 HTTP-01 还是 DNS-01:一个经常被默认选项坑到的问题

很多人第一次给网站签证书,用的都是 Certbot 默认的 HTTP-01:在 80 端口接一个 challenge 文件,Let's Encrypt 回源确认,签完走人。这条路在"一台机器、一个域名、80 端口开着"的经典场景里没有任何问题,于是它就成了大多数人的默认肌肉记忆。

问题出在环境稍微一变化,这个默认就开始咬人。

先说结论

HTTP-01 的隐性前提

HTTP-01 看起来"什么都不用配",其实它隐含了好几个前提,少一个就会半夜告警:

  1. 80 端口必须对公网可达。 Let's Encrypt 的验证服务器从多个网络位置回源。有些内网服务、只允许 443 的环境、或者运营商封了 80 的宽带,直接就过不去。
  2. 回源必须落到你这台机器。 如果域名前面有 CDN,而 CDN 没配好 challenge 路径的透传,验证请求会被 CDN 拦下。负载均衡后面多台机器时更麻烦——你在一台机器上放了 challenge 文件,请求可能被分到另一台。
  3. 证书只在跑验证的那台机器上。 想给多台机器装同一张证书,得自己解决分发问题,HTTP-01 本身帮不了你。

这些前提在单机上都不是事,但一旦架构复杂一点,每一条都是续期失败的高发区。而且续期失败往往发生在凌晨三点、你已经忘了这个站怎么配的半年后。

DNS-01 换来了什么

DNS-01 的思路是:在 DNS 里写一条 _acme-challenge TXT 记录,证明你控制这个域名的解析。它不碰 80 端口,不碰 Web 服务,CDN 和负载均衡怎么折腾都不影响。

代价是它依赖 DNS 服务商的 API。每次签发和续期都要新增再删除 TXT 记录,手动操作基本不可行——证书有效期 90 天,总不能每三个月定闹钟改一次解析。所以 DNS-01 的前提是自动化修改 DNS 记录的能力

如果你不想把主域名的 DNS API 凭据发给每台证书机器(这个凭据通常权限很大,能改整个域的所有解析),可以用 CNAME 委托:把 _acme-challenge.example.com 用 CNAME 指向另一个专门用于验证的子域或独立域,API 凭据只需要那个域的权限。主域被拖库的风险面就小了很多。这就像不给快递小哥家里的钥匙,只在门口放个快递柜。

一个容易忽略的点:验证方式和部署是两回事

不少人把"验证方式"和"证书装在哪"混在一起。其实两者正交:你可以用 DNS-01 在一台专门的机器上签发证书,再分发到 Nginx、CDN 或边缘节点;HTTP-01 签出来的证书同样可以拷走。区别只在于 DNS-01 天然适合"集中签发、多处部署"的模式,因为它不绑定任何一台 Web 服务器。

在 CertbotX 中实践

CertbotX 走的就是 DNS-01 加 CNAME 委托这条路:把 _acme-challenge 委托出去后,ACME 签发和到期前的重新签发都是自动完成的,不需要人工改解析。签好的证书可以自动部署到 Agent、EdgeOne 或其他 CDN 环境,每次部署留有记录,出了问题能查到哪台机器、哪个时间点换了哪张证书。对前面说的"多机分发"场景,这正好补上了 HTTP-01 最弱的那一环。

怎么选

问自己三个问题就够了:

  1. 要不要通配符?要 → DNS-01,没有第二条路。
  2. 80 端口能不能稳定回源到正确的机器?不能或不确信 → DNS-01。
  3. 证书是不是只装在一台机器上?不是 → 倾向 DNS-01 加自动分发。

三个答案都是"单机、80 通、单域名",那就老实 HTTP-01,别给自己加戏。方案没有高低,只有合不合你的现场。

单域名小站到底用 HTTP-01 还是 DNS-01:一个经常被默认选项坑到的问题:two certificate management approaches demonstrated on the same practical infrastructure workbench
单域名小站到底用 HTTP-01 还是 DNS-01:一个经常被默认选项坑到的问题:two certificate management approaches demonstrated on the same practical infrastructure workbench
单域名小站到底用 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
单域名小站到底用 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
单域名小站到底用 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
单域名小站到底用 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