如何在Ubuntu20.04上使用带有certbot-dns-digitalocean的DNS验证来获取Let'sEncrypt证书
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
大多数 Let's Encrypt 证书是使用 HTTP 验证颁发的,它允许在单个服务器上安装证书。 但是,HTTP 验证并不总是适合颁发用于负载平衡网站的证书,您也不能使用此验证来颁发通配符证书。
DNS 验证允许使用 DNS 记录验证证书颁发请求,而不是通过 HTTP 提供内容。 这意味着可以同时为在负载平衡器后面运行的 Web 服务器集群或无法通过 Internet 直接访问的系统颁发证书。
在本教程中,您将使用 Certbot 的 certbot-dns-digitalocean 挂钩通过 DigitalOcean API 使用 DNS 验证来颁发 Let's Encrypt 证书。
您可以使用 certbot-dns-digitalocean 工具将 Certbot 与 DigitalOcean 的 DNS 管理 API 集成,从而在您请求证书时自动配置证书验证记录。
certbot-dns-digitalocean 的另一个主要好处是,您可以使用它为可能在负载均衡器后面运行或无法通过 HTTP 直接访问的单个服务器颁发证书。 在这些情况下,您不能使用传统的 HTTP 证书验证,除非您在每台服务器上设置验证文件,这可能很不方便。 如果您想为无法通过 Internet 访问的服务器(例如内部系统或临时环境)颁发证书,则 certbot-dns-digitalocean 工具也很有用。
certbot-dns-digitalocean 还完全支持通配符证书,只能使用 DNS 验证来颁发。
先决条件
要完成本教程,您需要:
- 按照 Initial Server Setup 和 Ubuntu 20.04 设置的 Ubuntu 20.04 服务器,包括 sudo 非 root 用户。
- 通过您的 DigitalOcean 帐户管理的域名,即用于管理 DNS 记录。 在此特定示例中,我们将使用
your_domain
和subdomain.your_domain
以及*.your_domain
作为通配符证书,但是如果需要,您可以针对其他域或子域进行调整。 - 具有读写权限的 DigitalOcean API 密钥(个人访问令牌)。 要创建一个,请访问 如何创建个人访问令牌。
准备好这些后,以非 root 用户身份登录到您的服务器即可开始。
第 1 步 — 安装 Certbot
在此步骤中,您将安装 Certbot,这是一个用于颁发和管理 Let's Encrypt 证书的程序。
Certbot 在官方 Ubuntu Apt 存储库中可用,因此您可以使用默认系统包管理器安装它:
sudo apt update sudo apt install certbot
安装完成后,您可以使用以下命令进行检查:
certbot --version
这将输出类似于以下内容:
Outputcertbot 0.40.0
在此步骤中,您安装了 Certbot。 接下来,您将下载并安装 acme-dns-certbot 挂钩。
第 2 步 — 安装和配置 certbot-dns-digitalocean
现在您已经安装了基本 Certbot 程序,您可以下载并安装 certbot-dns-digitalocean,这将允许 Certbot 使用 DigitalOcean DNS 管理 API 在 DNS 验证模式下运行。
与您在步骤 1 中安装的 Certbot 本身一样,certbot-dns-digitalocean 实用程序在 Ubuntu 的默认存储库中可用。 但是,Certbot 存储库包含更可靠的更新版本,因此始终建议尽可能使用它。
继续安装 certbot-dns-digitalocean 的软件包:
sudo apt install python3-certbot-dns-digitalocean
安装完成后,您需要设置一个配置文件,其中包含作为先决条件的一部分生成的 DigitalOcean API 密钥/个人访问令牌。
首先在私有位置创建 creds.ini
文件:
touch ~/certbot-creds.ini
接下来,限制文件的权限,以确保服务器上没有其他用户可以读取它:
chmod go-rwx ~/certbot-creds.ini
最后,使用文本编辑器打开文件并添加 DigitalOcean 访问令牌:
nano ~/certbot-creds.ini
该文件的内容如下:
~/certbot-creds.ini
dns_digitalocean_token = your_digitalocean_access_token
完成后,保存并关闭文件。
警告: 您的 DigitalOcean 访问令牌授予对您的 DigitalOcean 帐户的访问权限,因此您必须像保护密码一样保护它。 不要与任何人共享它或将其检入公共代码存储库。
在此步骤中,您下载并安装了 certbot-dns-digitalocean 实用程序并创建了一个包含您的 API 凭据的配置文件。
第 3 步 — 颁发证书
在此步骤中,您将使用 Certbot 和 DigitalOcean API 颁发证书。
要颁发您的第一个证书,请使用以下参数运行 Certbot,确保为您的凭证文件和域指定正确的路径:
sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d your_domain -d subdomain.your_domain
注意: 如果您看到 unsafe permissions on credentials configuration file
警告,这表明文件权限没有被正确限制,从而允许您服务器上的其他用户访问您的令牌。 请仔细检查步骤 2 中的 chmod
命令。
Certbot 将需要几秒钟来请求证书; 然后,您将收到一条消息,确认它已颁发您的证书:
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 ...
如果证书颁发失败,这可能是因为没有足够的时间传播 DNS 更改。 您可以选择增加 DNS 传播延迟,以便为验证 DNS 记录传播和被 Let's Encrypt 获取更多时间。 默认情况下延迟为 10 秒,但您可以使用 --dns-digitalocean-propagation-seconds
参数增加此延迟:
sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini --dns-digitalocean-propagation-seconds 30 -d your_domain -d subdomain.your_domain
最后,您还可以使用 certbot-dns-digitalocean 为您的域颁发通配符证书:
sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d \*.your_domain
注意: 在某些情况下,在短时间内为相同的主机名请求多个证书可能会导致颁发开始失败。 这是由于速率限制和 DNS 生存时间 (TTL) 值造成的,这有时会导致新 DNS 更改的传播延迟。
为了缓解这种情况,您可能希望等待 TTL 的持续时间,或考虑调整本步骤前面详述的 --dns-digitalocean-propagation-seconds
选项。
在此步骤中,您首次将 Certbot 与 certbot-dns-digitalocean 一起使用并颁发了初始证书。
第 4 步 — 更新证书
在这最后一步中,您将使用 Certbot 和 certbot-dns-digitalocean 续订证书。
一旦您的证书即将到期,Certbot 就可以为您自动更新它们:
sudo certbot renew
续订过程可以在没有用户交互的情况下从头到尾运行。 它还将记住您在初始设置期间指定的配置选项。
默认情况下,Certbot 会将其作为自动计划系统任务运行,这意味着您的证书不需要进一步维护。 您可以通过打印出关联系统服务的状态来检查计划任务是否已正确安装,即certbot.timer
:
sudo systemctl status certbot.timer
这将输出类似于以下内容的内容,其中显示了计划每天运行两次的已加载任务:
Output● certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Sun 2020-11-22 18:18:40 UTC; 2 weeks 6 days ago Trigger: Sun 2020-12-13 7:17:57 UTC; 11h left Nov 22 18:18:40 droplet1 systemd[1]: Started Run certbot twice daily.
但是,为了测试这是否有效,而不必等到证书的到期日更近,您可以触发“试运行”。 这将模拟续订过程,而无需对您的配置进行任何实际更改。
您可以使用标准 renew
命令触发空运行,但使用 --dry-run
参数:
sudo certbot renew --dry-run
这将输出类似于以下内容的内容,这将确保更新过程正常运行:
Output... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator dns-digitalocean, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your_domain dns-01 challenge for subdomain.your_domain Waiting 10 seconds for DNS changes to propagate Waiting for verification... Cleaning up challenges ...
在最后一步中,您在 Certbot 中测试了自动续订过程。
结论
在本教程中,您使用 certbot-dns-digitalocean 设置 Certbot 以使用带有 DigitalOcean DNS 管理 API 的 DNS 验证来颁发证书。
如果您有兴趣了解有关 certbot-dns-digitalocean 的更多信息,您可能希望查看该实用程序的官方文档:
或者,如果您不使用 DigitalOcean 来管理您的 DNS 记录,您可能希望查看 如何在 Ubuntu 18.04 上使用带有 acme-dns-certbot 的 DNS 验证获取 Let's Encrypt 证书,这是一个certbot-dns-digitalocean 的与提供者无关的替代方案。
最后,如果您想进一步阅读技术资料,您可以通过查看官方 RFC 文档的相关部分来深入了解 ACME DNS 验证的详细信息,该部分概述了该过程的工作原理: