使用 Let's Encrypt 和 ACME 为客户进行入职
如果您在托管服务提供商或 CDN 工作,ACME 的 DNS-01 验证方法可以使您更容易地为那些在其他提供商处拥有现有 HTTPS 网站的新客户进行入职。在您的新客户将其域名指向您的服务器之前,您需要先为他们安装证书。否则,访问客户网站的访问者将在您发布和安装证书时出现几分钟的停机时间。为了解决这个问题,您和您的新客户应该使用 DNS-01 验证方法,在客户切换其网站的 DNS 之前发布证书。
DNS 验证方法的工作原理
DNS-01 验证方法 的工作原理如下:为了证明您控制着 www.example.com
,您需要在 _acme-challenge.www.example.com
上创建一个 TXT 记录,其中包含 ACME 指定的“摘要值”(您的 ACME 客户端应该负责为您创建此摘要值)。当 TXT 记录准备就绪后,您的 ACME 客户端会通知 ACME 服务器(例如,Let's Encrypt),表明该域名已准备好进行验证。ACME 服务器会查找 TXT 记录,将其与预期摘要值进行比较,如果结果正确,则会认为您的帐户被授权为 www.example.com
发布证书。您的新客户可以设置此 TXT 记录(或 CNAME),而不会干扰正常的网站操作。
CNAME 的优势
我建议托管服务提供商和 CDN 使用一种额外的技巧:不要将摘要值提供给您的新客户并告诉他们使用它创建 TXT 记录,而是告诉您的客户将 _acme-challenge.www.example.com
从 CNAME 配置到您控制的域名,并且该域名对于要验证的域名来说是唯一的。例如,您可以使用 www.example.com.validationserver.example.net
。然后,一旦您的软件验证了此 CNAME 已设置(考虑传播延迟和 Anycast),您的 ACME 客户端应开始为 www.example.com
进行验证过程,在 www.example.com.validationserver.example.net
上配置一个 TXT 记录。由于 ACME 服务器的 TXT 查找会遵循 CNAME(所有 DNS 查找也一样),因此它将看到您配置的值,并认为您的帐户被授权。
这种方法比让您的客户直接配置他们的 TXT 记录更可取,原因有几个。首先,它能让您的客户有足够的时间来设置 CNAME。如果您提前创建了一个待处理的授权并让您的客户自己部署摘要值,则它有一个固定的有效期,在有效期结束后将过期(对于 Let's Encrypt,此有效期为 7 天)。如果您的客户没有在该时间段内完成该流程,您将不得不创建一个新的待处理的授权,并为您的客户提供一个新的摘要值。这对您和您的客户来说都令人讨厌且浪费时间。使用 CNAME 方法意味着即使您的新客户需要一个月才能对他们的 DNS 进行必要的更改,您也可以在他们进行更改后立即启动并运行一切。
除了让新客户直接配置他们的 TXT 记录以外,另一个更倾向于使用 CNAME 方法的原因是它支持定期轮换您的 ACME 帐户密钥的最佳实践。由于用于 DNS-01 验证的摘要值是根据您当前的 ACME 帐户密钥计算出来的,因此每次您轮换帐户密钥时它都会发生变化。如果您让客户手动配置他们的 TXT 记录,这意味着要通知潜在的新客户,您要求他们在 DNS 中输入的值已不再有效,他们需要使用另一个值。这很不方便!如果您改为使用 CNAME 方法,您只需要让您的新客户在 DNS 中输入一个与 ACME 相关的值,并且它不会随着您更改帐户密钥而改变。
清理未使用的 CNAME
最后一点:这是一个很好的客户入职方法,但您还需要检测客户何时自行退出。他们可能只是将他们的 A 记录更改为指向不同的 CDN,而没有告诉您他们的计划已经改变。您应该监控这种情况并停止尝试发布证书。如果客户留下了指向您的 CNAMEd _acme-challenge
子域,您应该联系他们并提醒他们将其删除。CNAMEd 子域代表了发布证书的委托授权,清理该委托将提高客户和您自身的安全性。类似地,如果客户设置了 CNAME 并且您代表他们发布了证书,但他们从未将他们的 A 记录指向您的服务器,您不应该在没有客户的进一步干预的情况下无限期地重新发布新证书。