我们之前分享过[Les's Encrypt的使用教程]( " Les's Encrypt的使用教程")。大多数 Let's Encrypt 证书使用 HTTP 验证颁发,这样可以轻松地在单个服务器上安装证书。然而,HTTP 验证并不总是适合为负载均衡网站颁发证书,也不能用于通配符证书的颁发。
DNS 验证通过 DNS 记录来验证证书请求,而不是通过 HTTP 提供内容。这意味着可以为负载均衡器后的 Web 服务器集群,或无法直接通过互联网访问的系统颁发证书。使用 DNS 验证同样支持通配符证书。
acme-dns-certbot 工具可以将 Certbot 连接到第三方 DNS 服务器,当你请求证书时,通过 API 自动设置证书验证记录。这样,你无需将 Certbot 直接集成到 DNS 提供商账户中,也不需要授予它对完整 DNS 配置的无限制访问权限,从而提升了安全性。
委派DNS 区域用于将证书验证记录的查找重定向到第三方 DNS 服务,因此一旦完成初始设置,你可以请求任意数量的证书,而无需执行任何手动验证。
acme-dns-certbot 的另一个主要优点是它可以为负载均衡器后面的服务器,或无法通过 HTTP 直接访问的单独服务器颁发证书。在这些情况下,除非你在每台服务器上设置验证文件,否则无法使用传统的 HTTP 证书验证。如果你需要为无法通过互联网访问的服务器(如内部系统或暂存环境)颁发证书,acme-dns-certbot 工具也非常实用。
在本教程中,你将使用 Certbot 的 acme-dns-certbot 钩子,通过 DNS 验证来颁发 Let's Encrypt 证书。
准备工作
要完成本教程,你需要:
按照 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
这将输出类似以下内容的内容:
Output
certbot 0.31.0
在此步骤中,你安装了 Certbot。接下来,你将下载并安装 acme-dns-certbot 钩子。
步骤 2 --- 安装 acme-dns-certbot
现在已经安装了基本的 Certbot 程序,你可以下载并安装 acme-dns-certbot,它将使 Certbot 在 DNS 验证模式下运行。
首先,下载脚本的副本:
注意:作为最佳实践,在运行此 GitHub 代码库和脚本之前,务必对其进行检查。你也可以先分叉该代码库,然后使用 acme-dns-certbot.py 脚本。此分叉增加了一层安全性,确保脚本仍然在你的控制之下,并不易受到未经验证的更改影响。
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:
#!/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
续订过程可以从头到尾运行,无需用户交互,并且会记住您在初始设置期间指定的所有配置选项。
要测试此功能是否有效,而不必等到到期日临近,你可以触发试运行。这将模拟续订过程,而无需对你的配置进行任何实际更改。
你可以使用标准续订命令触发试运行,但要使用 --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 项目的文档。
另外,你也可以查阅官方 RFC 文档的相关部分,以更深入了解 ACME DNS 验证的技术细节,该文档概述了整个过程的工作原理:RFC8555 - 第 8.4 节。
如果你还需要了解更多 DigitalOcean 的产品信息以及数据库、云存储、GPU 云服务等相关教程,可以访问 DigitalOcean 中国区独家战略合作伙伴卓普云的官网,如需进一步的商洽可联系卓普云的技术支持。