如何在Ubuntu18.04上使用带有acme-dns-certbot的DNS验证获取Let'sEncrypt证书
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
大多数 Let's Encrypt 证书是使用 HTTP 验证颁发的,这允许在单个服务器上轻松安装证书。 但是,HTTP 验证并不总是适合颁发用于负载均衡网站的证书,也不能用于颁发 通配符证书。
DNS 验证允许使用 DNS 记录验证证书颁发请求,而不是通过 HTTP 提供内容。 这意味着可以同时为在负载平衡器后面运行的 Web 服务器集群或无法通过 Internet 直接访问的系统颁发证书。 使用 DNS 验证也支持通配符证书。
acme-dns-certbot 工具用于将 Certbot 连接到第三方 DNS 服务器,当您请求证书时,可以通过 API 自动设置证书验证记录。 这样做的好处是您不需要将 Certbot 直接与您的 DNS 提供商帐户集成,也不需要授予它对您的完整 DNS 配置的无限制访问权限,这有利于安全性。
委托 DNS 区域 用于将证书验证记录的查找重定向到第三方 DNS 服务,因此一旦完成初始设置,您就可以根据需要申请任意数量的证书,而无需执行任何手动验证。
acme-dns-certbot 的另一个主要好处是,它可用于为单个服务器颁发证书,这些服务器可能在负载均衡器后面运行,或者无法通过 HTTP 直接访问。 在这些情况下不能使用传统的 HTTP 证书验证,除非您在每台服务器上设置验证文件。 如果您想为无法通过 Internet 访问的服务器(例如内部系统或临时环境)颁发证书,acme-dns-certbot 工具也很有用。
在本教程中,您将使用 Certbot 的 acme-dns-certbot 挂钩使用 DNS 验证来颁发 Let's Encrypt 证书。
先决条件
要完成本教程,您需要:
- 按照 Initial Server Setup 和 Ubuntu 18.04 设置的 Ubuntu 18.04 服务器,包括 sudo 非 root 用户。
- 您可以获得 TLS 证书的域名,包括添加 DNS 记录的能力。 在此特定示例中,我们将使用
your-domain
和subdomain.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
这将输出类似于以下内容:
Outputcertbot 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
将 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 所需的 DNS CNAME 记录 ,这将在此步骤的后面部分介绍。 如果没有 --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... ...
您需要将所需的 DNS CNAME
记录添加到您的域的 DNS 配置中。 这会将 _acme-challenge
子域的控制权委托给 ACME DNS 服务,这将允许 acme-dns-certbot 设置所需的 DNS 记录以验证证书请求。
如果您使用 DigitalOcean 作为您的 DNS 提供商,您可以在控制面板中设置 DNS 记录:
建议将 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 名称颁发证书,而无需添加另一个 DNS CNAME
记录。 但是,如果您希望为不同的子域或全新的域名获取证书,系统会提示您添加另一个 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 验证的技术细节,该文档概述了该过程的工作原理: