在 Ubuntu 上使用 acme-dns-certbot 获取 Let‘s Encrypt 证书

我们之前分享过[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:

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

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

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

你可以使用标准续订命令触发试运行,但要使用 --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 中国区独家战略合作伙伴卓普云的官网,如需进一步的商洽可联系卓普云的技术支持

相关推荐
朱小弟cs65 小时前
Orange的运维学习日记--41.Ansible基础入门
linux·运维·学习·ci/cd·自动化·ansible·devops
CIb0la6 小时前
kali linux 2025.2安装WPS并设置无报错的详细步骤
linux·运维·wps
醉方休7 小时前
Node.js 精选:50 款文件处理与开发环境工具库
linux·运维·node.js
代码老y8 小时前
从裸机到云原生:Linux 操作系统实战进阶的“四维跃迁”
linux·运维·云原生
CMCST8 小时前
CentOS 7.9 升级 GLibc 2.34
linux·运维·centos
xiep14383335109 小时前
Rocky Linux 10 部署 Kafka 集群
linux·运维·kafka
笨鸟要努力12 小时前
Ubuntu 全盘备份
linux·运维·ubuntu
ChironW12 小时前
Ubuntu 22.04 离线环境下完整安装 Anaconda、CUDA 12.1、NVIDIA 驱动及 cuDNN 8.9.3 教程
linux·运维·人工智能·深度学习·yolo·ubuntu
轻松Ai享生活13 小时前
linux 日志详解
linux
小白的代码日记14 小时前
Linux常用指令
linux·运维·服务器