如何在 Ubuntu 18.04 上通过 acme-dns-certbot 使用 DNS 验证获取 Let’s Encrypt 证书

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

大多数Let’s Encrypt证书是使用 HTTP 验证颁发的,这允许在单个服务器上轻松安装证书。但是,HTTP 验证并不总是适合颁发用于负载均衡网站的证书,也不能用于颁发通配符证书

DNS 验证允许使用 DNS 记录来验证证书颁发请求,而不是通过 HTTP 提供内容。这意味着可以同时为在负载均衡器后面运行的 Web 服务器集群或无法通过 Internet 直接访问的系统颁发证书。使用 DNS 验证也支持通配符证书。

极致的DNS-certbot工具是用于连接Certbot到证书验证记录可以自动通过API,当你申请一个证书设置第三方DNS服务器。这样做的好处是,您不需要将 Certbot 直接与您的 DNS 提供商帐户集成,也不需要授予它对完整 DNS 配置的无限制访问权限,这有利于安全。

委托DNS 区域用于将证书验证记录的查找重定向到第三方 DNS 服务,因此一旦完成初始设置,您就可以请求任意数量的证书,而无需执行任何手动验证。

acme-dns-certbot 的另一个主要优点是它可用于为可能在负载均衡器后面运行或无法通过 HTTP 直接访问的单个服务器颁发证书。在这些情况下不能使用传统的 HTTP 证书验证,除非您在每台服务器上设置验证文件。如果您想为无法通过 Internet 访问的服务器(例如内部系统或临时环境)颁发证书,acme-dns-certbot 工具也很有用。

在本教程中,您将使用 Certbot 的 acme-dns-certbot 挂钩来使用 DNS 验证颁发 Let’s Encrypt 证书。

先决条件

要完成本教程,您需要:

  • 按照 Ubuntu 18.04 的初始服务器设置(包括 sudo 非 root 用户)设置的 Ubuntu 18.04 服务器

  • 您可以为其获取 TLS 证书的域名,包括添加 DNS 记录的能力。在此特定示例中,我们将使用your-domainsubdomain.your-domain以及通配符证书。但是,如果需要,可以针对其他域、子域或通配符进行调整。*.your-domain

准备好这些后,以非 root 用户身份登录到您的服务器开始。

步骤 1 — 安装 Certbot

在这一步中,您将安装 Certbot,这是一个用于颁发和管理 Let’s Encrypt 证书的程序。

Certbot 在官方 Ubuntu Apt 存储库中可用,但是,建议使用 Certbot 开发人员维护的存储库,因为它始终具有最新版本的软件。

首先添加 Certbot 存储库:

  • sudo apt-add-repository ppa:certbot/certbot

您需要按ENTER接受提示并将新存储库添加到您的系统。

接下来,安装 Certbot 包:

  • sudo apt install certbot

安装完成后,您可以检查 Certbot 是否已成功安装:

  • certbot --version

这将输出类似于以下内容的内容:

Output
certbot 0.31.0

在此步骤中,您安装了 Certbot。接下来,您将下载并安装 acme-dns-certbot 挂钩。

步骤 2 — 安装 acme-dns-certbot

现在基本 Certbot 程序已经安装,您可以下载并安装 acme-dns-certbot,这将允许 Certbot 在 DNS 验证模式下运行。

首先下载脚本的副本:

  • wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

下载完成后,将脚本标记为可执行文件:

  • chmod +x acme-dns-auth.py

然后,使用您喜欢的文本编辑器编辑文件并调整第一行以强制它使用 Python 3:

  • nano acme-dns-auth.py

将 a 添加3到第一行的末尾:

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

这是必需的,以确保脚本使用 Python 3 的最新支持版本,而不是旧版 Python 版本 2。

完成后,保存并关闭文件。

最后,将脚本移动到 Certbot Let’s Encrypt 目录中,以便 Certbot 可以加载它:

  • sudo mv acme-dns-auth.py /etc/letsencrypt/

在此步骤中,您下载并安装了 acme-dns-certbot 挂钩。接下来,您可以开始设置过程并努力颁发您的第一个证书。

第 3 步 – 设置 acme-dns-certbot

为了开始使用 acme-dns-certbot,您需要完成初始设置过程并至少颁发一个证书。

首先运行 Certbot 以强制它使用 DNS 验证颁发证书。这将运行 acme-dns-certbot 脚本并触发初始设置过程:

  • sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

您可以使用该--manual参数禁用 Certbot 的所有自动集成功能。在这种情况下,您只是颁发原始证书,而不是自动将其安装在服务上。

您可以通过--manual-auth-hook参数将 Certbot 配置为使用 acme-dns-certbot 挂钩您运行该--preferred-challenges参数,以便 Certbot 优先考虑 DNS 验证。

您还必须告诉 Certbot 在尝试验证证书之前暂停,您可以使用--debug-challenges参数进行验证这是为了允许您设置acme-dns-certbot 所需的 DNSCNAME记录,这将在本步骤的后面部分进行介绍。如果没有--debug-challenges参数,Certbot 不会暂停,因此您将没有时间进行所需的 DNS 更改。

请记住使用-d参数替换您希望使用的每个域名如果要颁发通配符证书,请确保*使用反斜杠 ( \)将星号 ( ) 转义

遵循标准的 Certbot 步骤后,您最终会收到类似于以下内容的消息提示:

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

您需要将所需的 DNSCNAME记录添加到您的域的 DNS 配置中。这会将_acme-challenge子域的控制委托给 ACME DNS 服务,这将允许 acme-dns-certbot 设置所需的 DNS 记录以验证证书请求。

如果您使用 DigitalOcean 作为您的 DNS 提供商,您可以在您的控制面板中设置 DNS 记录:

DigitalOcean DNS 控制面板的屏幕截图,显示了 ACME DNS 的 CNAME 记录示例

建议将 TTL(生存时间)设置为 300 秒左右,以帮助确保快速传播对记录的任何更改。

配置完 DNS 记录后,返回 Certbot 并按下ENTER以验证证书请求并完成颁发过程。

这将需要几秒钟,然后您将看到一条消息,确认已颁发证书:

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

您是第一次运行 acme-dns-certbot,设置了所需的 DNS 记录,并成功颁发了证书。接下来,您将设置证书的自动续订。

第 4 步 – 使用 acme-dns-certbot

在这最后一步中,您将使用 acme-dns-certbot 颁发更多证书并更新现有证书。

首先,既然您已经使用 acme-dns-certbot 成功颁发了至少一个证书,您可以继续为相同的 DNS 名称颁发证书,而无需添加另一条 DNSCNAME记录。但是,如果您希望为不同的子域或全新的域名获取证书,系统将提示您添加另一条CNAME记录。

例如,您可以颁发另一个独立的通配符证书,而无需再次执行验证:

  • sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

但是,如果您尝试为子域颁发证书,系统会提示您为子域添加CNAME记录:

  • sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

这将显示类似于您在步骤 3 中执行的初始设置的输出:

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

既然您可以使用 acme-dns-certbot 颁发证书,那么也值得考虑续订过程。

一旦您的证书即将到期,Certbot 可以自动为您续订:

  • sudo certbot renew

续订过程可以从头到尾运行,无需用户交互,并且会记住您在初始设置期间指定的所有配置选项。

要测试这是否有效而不必等到接近到期日期,您可以触发试运行。这将模拟续订过程,而无需对您的配置进行任何实际更改。

您可以使用标准renew命令触发试运行,但使用--dry-run参数:

  • sudo certbot renew --dry-run

这将输出类似于以下内容的内容,这将确保续订过程正常运行:

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

在这最后一步中,您颁发了另一个证书,然后在 Certbot 中测试了自动续订过程。

结论

在本文中,您使用 acme-dns-certbot 设置 Certbot,以便使用 DNS 验证颁发证书。这释放了使用通配符证书以及管理可能位于负载平衡器后面的大量不同 Web 服务器的可能性。

请务必密切关注acme-dns-certbot 存储库以获取脚本的任何更新,因为始终建议运行最新的受支持版本。

如果您有兴趣了解有关 acme-dns-certbot 的更多信息,您可能希望查看 acme-dns 项目的文档,它是 acme-dns-certbot 的服务器端元素:

acme-dns 软件也可以是自托管的,如果您在高安全性或复杂的环境中运行,这可能会很有用。

或者,您可以通过查看官方 RFC 文档的相关部分来深入了解 ACME DNS 验证的技术细节,该部分概述了该过程的工作原理:

觉得文章有用?

点个广告表达一下你的爱意吧 !😁