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

作者选择COVID-19 Relief Fund作为Write for DONations计划的一部分接受捐款。

简介

大多数让我们加密证书是使用HTTp验证颁发的,它允许在单个服务器上安装证书。但是,HTTP验证并不总是适合于颁发用于负载平衡网站的证书,您也不能使用此验证来颁发通配符证书。

DNS验证允许使用DNS记录来验证证书颁发请求,而不是通过HTTP提供内容。这意味着可以同时为负载均衡器后面运行的Web服务器集群或无法通过Internet直接访问的系统颁发证书。

在本教程中,您将使用Certbot的DNS钩子通过DigitalOcean API使用certbot-dns-digitalocean验证来颁发一份We‘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非超级用户。
  • 通过您的DigitalOcean帐户管理的域名-即用于管理DNS记录。在本例中,我们将使用you_domainsubdomain.you_domain,以及* .you_domain作为通配符证书,但您可以根据需要调整其他域名或子域。
  • 具有读写权限的DigitalOcean API密钥(个人访问令牌)。要创建个人访问权限,请访问How to Create a Personal Access Token.

准备就绪后,以非根用户身份登录到您的服务器即可开始。

第一步-安装Certbot

在本步骤中,您将安装Certbot,这是一个颁发和管理We‘s Encryption证书的程序。

Certbot在官方的Ubuntu APT存储库中提供,因此您可以使用默认的系统包管理器进行安装:

1sudo apt update
2sudo apt install certbot

安装完成后,您可以使用以下命令进行检查:

1certbot --version

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

1[secondary_label Output]
2certbot 0.40.0

在此步骤中,您安装了Certbot。接下来,您将下载并安装acme-dns-certbot挂钩。

第二步-安装配置certbot-dns-digitalOcean

现在您已经安装了基本的Certbot程序,您可以下载并安装certbot-dns-digitalOcean,这将允许Certbot使用DigitalOcean DNS管理API在DNS验证模式下运行。

与您在步骤1中安装的Certbot本身一样,certbot-dns-digitalocean实用程序在Ubuntu的默认存储库中可用。但是,Certbot存储库包含更可靠的更新版本,因此始终建议在可能的情况下使用此版本。

继续安装certbot-dns-digitalOcean的程序包:

1sudo apt install python3-certbot-dns-digitalocean

安装完成后,您需要设置一个配置文件,其中包含您作为先决条件的一部分生成的DigitalOcean API密钥/个人访问令牌。

首先,在私有位置创建reds.ini文件:

1touch ~/certbot-creds.ini

接下来,限制文件的权限,以确保您的服务器上的其他用户无法读取该文件:

1chmod go-rwx ~/certbot-creds.ini

最后,使用文本编辑器打开文件并添加DigitalOcean访问令牌:

1nano ~/certbot-creds.ini

该文件的内容如下:

1[label ~/certbot-creds.ini]
2dns_digitalocean_token = your_digitalocean_access_token

完成后,保存并关闭文件。

<$>[警告] 警告: 您的DigitalOcean访问令牌授予您的DigitalOcean帐户访问权限,因此您必须像保护密码一样保护它。不要与任何人共享它,也不要将其签入公共代码存储库。 <$>

在本步骤中,您下载并安装了certbot-dns-digitalOcean实用程序,并创建了一个包含您的API凭据的配置文件。

第三步-颁发证书

在此步骤中,您将使用Certbot和DigitalOcean API颁发证书。

要颁发第一个证书,请使用以下参数运行Certbot,确保指定凭据文件和域的正确路径:

1sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d your_domain -d subdomain.your_domain

<$>[备注] 注意: 如果您看到凭据配置文件权限不安全的警告,则表示没有正确限制文件权限,从而允许您服务器上的其他用户访问您的令牌。请使用步骤2中的chmod命令再次检查。 <$>

Certbot将需要几秒钟的时间来请求证书;然后您将收到一条消息,确认它已为您颁发证书:

1[secondary_label Output]
2...
3Congratulations! Your certificate and chain have been saved at:
4/etc/letsencrypt/live/your_domain/fullchain.pem
5Your key file has been saved at:
6/etc/letsencrypt/live/your_domain/privkey.pem
7...

如果证书颁发失败,这可能是因为没有足够的时间传播DNS更改。您可以选择增加dns传播延迟,以便有更多时间传播验证dns记录,并由We‘s Encrypt拾取。默认延时为10秒,可使用--dns-digitalOcean-proportation-secuds参数增加:

1sudo 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为您的域颁发通配符证书:

1sudo certbot certonly --dns-digitalocean --dns-digitalocean-credentials ~/certbot-creds.ini -d \*.your_domain

<$>[备注] 注意: 在某些情况下,在短时间内为同一主机名请求多个证书可能会导致颁发开始失败。这是由于速率限制和DNS生存时间(TTL)值造成的,这有时会导致传播新的DNS更改的延迟。

为了缓解这一问题,您可能希望等待TTL的持续时间,或者考虑调整本步骤前面详细介绍的`--dns-digitalOcean-Proportation-Second‘选项。 <$>

在本步骤中,您首次将Certbot与certbot-dns-digitalOcean一起使用,并颁发了初始证书。

第四步-续费证书

在最后一步中,您将使用Certbot和certbot-dns-digitalocean续订证书。

一旦您的证书即将到期,Certbot将能够自动为您续订:

1sudo certbot renew

续订过程可以在没有用户交互的情况下从头到尾运行。它还将记住您在初始设置期间指定的配置选项。

默认情况下,Certbot会将其作为自动计划的系统任务运行,这意味着您的证书不需要进一步维护。您可以通过打印出关联的系统服务的状态certbot.timer来检查定时任务是否安装正确:

1sudo systemctl status certbot.timer

这将输出类似于下面的内容,其中显示了计划每天运行两次的加载任务:

1[secondary_label Output]
2 certbot.timer - Run certbot twice daily
3   Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
4   Active: active (waiting) since Sun 2020-11-22 18:18:40 UTC; 2 weeks 6 days ago
5  Trigger: Sun 2020-12-13 7:17:57 UTC; 11h left
6
7Nov 22 18:18:40 droplet1 systemd[1]: Started Run certbot twice daily.

然而,为了测试这是否有效,而不必等到您的证书(S)接近到期日期时,您可以触发演练。这将模拟续订过程,而不会对您的配置进行任何实际更改。

您可以使用标准的renew命令触发试运行,但使用--ry-run参数:

1sudo certbot renew --dry-run

这将输出类似以下内容的内容,以确保续订过程正常运行:

 1[secondary_label Output]
 2...
 3Cert not due for renewal, but simulating renewal for dry run
 4Plugins selected: Authenticator dns-digitalocean, Installer None
 5Renewing an existing certificate
 6Performing the following challenges:
 7dns-01 challenge for your_domain
 8dns-01 challenge for subdomain.your_domain
 9Waiting 10 seconds for DNS changes to propagate
10Waiting for verification...
11Cleaning up challenges
12...

在最后一步中,您测试了Certbot中的自动续订流程。

结论

在本教程中,您将使用certbot-dns-digitalocean设置Certbot,以使用DigitalOcean DNS管理API进行DNS验证来颁发证书。

如果您有兴趣了解有关certbot-dns-digitalOcean的更多信息,您可能希望查看该实用程序的官方文档:

或者,如果您不使用DigitalOcean来管理您的域名系统记录,您可能希望查看如何在Ubuntu 18.04,上使用acme-dns-certbot的dns验证获取让我们使用dns验证加密证书,这是certbot-dns-digitalOcean的一个与提供商无关的替代方案。

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

Published At
Categories with 技术
comments powered by Disqus