如何在 Ubuntu 20.04 上使用 DNS 验证和 certbot-dns-digitalocean 获取 Let’s Encrypt 证书

作者选择了COVID-19 救济基金来接受捐赠,作为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 验证来颁发。

先决条件

要完成本教程,您需要:

  • 通过使用 Ubuntu 20.04 执行初始服务器设置来设置 Ubuntu 20.04 服务器,包括 sudo 非 root 用户。

  • 通过您的 DigitalOcean 帐户管理的域名,即用于管理 DNS 记录。在此特定示例中,我们将使用your_domainsubdomain.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

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

Output
certbot 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警告,这表明文件权限没有被正确限制,从而允许您服务器上的其他用户访问您的令牌。请仔细检查chmod步骤 2 中命令。

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 验证获取让我们加密证书,这是 certbot 的提供商无关替代方案-dns-digitalocean。

最后,如果您想要进一步的技术阅读,您可以通过查看官方 RFC 文档的相关部分来深入了解 ACME DNS 验证的详细信息,其中概述了该过程的工作原理:

觉得文章有用?

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