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

作者选择新冠肺炎救济Fund]接受捐赠,作为编写捐款计划)的一部分。

简介

大多数让我们加密证书是使用HTTp验证颁发的,这允许在单个服务器上轻松安装证书。然而,http验证并不总是适合于颁发用于负载均衡网站的证书,也不能用于颁发通配符certificates.

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

acme-dns-certbot工具用于将Certbot)连接到第三方域名服务器,当您请求证书时,可以通过接口自动设置证书验证记录。这样做的好处是,您不需要直接将Certbot与您的DNS提供商帐户集成在一起,也不需要授予它对您的完整DNS配置的无限制访问权限,这对安全性是有利的。

Delegated[DNSdns]用于将证书验证记录的查找重定向到第三方zones](https://andsky.com/tech/tutorials/an-introduction-to-dns-terminology-components-and-concepts# zone-files)服务,因此一旦完成初始设置,您就可以申请任意数量的证书,而无需执行任何手动验证。

Acme-dns-certbot的另一个主要优点是,它可以用于为可能在负载均衡器之后运行的单个服务器颁发证书,或者以其他方式无法通过HTTP直接访问这些服务器。除非您在每台服务器上都设置了验证文件,否则在这些情况下不能使用传统的HTTP证书验证。如果要为无法通过Internet访问的服务器(如内部系统或临时环境)颁发证书,acme-dns-certbot工具也很有用。

在本教程中,您将使用Certbot的acme-dns-certbot挂钩来颁发一个使用DNS验证的We‘s Encrypt证书。

前提条件

要完成本教程,您需要:

  • 按照Ubuntu 18.04,初始服务器设置,包括Sudo非根用户]设置的Ubuntu18.04服务器。
  • 您可以为其获取TLS证书的域名,包括添加DNS记录的能力。在本例中,我们将使用you-domainsubdomain.you-domain,以及* .you-domain作为通配符证书。但是,如果需要,可以针对其他域、子域或通配符进行调整。

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

第一步-安装Certbot

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

Certbot可以在官方的Ubuntu APT库中获得,但是,建议使用由Certbot开发人员维护的库,因为那里总是有最新版本的软件。

首先添加Certbot存储库:

1sudo apt-add-repository ppa:certbot/certbot

您需要按Enter键接受提示并将新存储库添加到您的系统中。

接下来,安装Certbot包:

1sudo apt install certbot

安装完成后,您可以检查Certbot是否已成功安装:

1certbot --version

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

1[secondary_label Output]
2certbot 0.31.0

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

第二步-安装acme-dns-certbot

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

首先下载该脚本的副本:

1wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

下载完成后,将脚本标记为可执行:

1chmod +x acme-dns-auth.py

然后,使用您最喜欢的文本编辑器编辑该文件,并调整第一行以强制其使用Python3:

1nano acme-dns-auth.py

在第一行末尾添加3

1[label acme-dns-certbot.py]
2#!/usr/bin/env python3
3. . .

这是必需的,以确保该脚本使用受支持的最新版本的Python3,而不是旧版的Python第2版。

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

最后,将脚本移到Certbot We‘s Encrypt目录中,以便Certbot可以加载它:

1sudo mv acme-dns-auth.py /etc/letsencrypt/

在本步骤中,您下载并安装了acme-dns-certbot挂钩。接下来,您可以开始设置过程并努力颁发您的第一个证书。

第三步-设置acme-dns-certbot

为了开始使用acme-dns-certbot,您需要完成初始设置过程并颁发至少一个证书。

首先运行Certbot,强制它使用DNS验证颁发证书。这将运行acme-dns-certbot脚本并触发初始设置过程:

1sudo 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所需的dnsCNAMErecord(s),这将在本步骤后面介绍。如果没有`--DEBUG-Challenges‘参数,Certbot就不会暂停,因此您没有时间进行所需的DNS更改。

请记住使用-d参数替换您希望使用的每个域名。如果您想颁发通配符证书,请确保使用反斜杠(\)转义星号(* )。

按照标准的Certbot步骤操作后,系统最终会提示您一条类似以下内容的消息:

1[secondary_label Output]
2...
3Output from acme-dns-auth.py:
4Please add the following CNAME record to your main DNS zone:
5_acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io.
6
7Waiting for verification...
8...

您需要将所需的DNSCNAME记录添加到您的域名的DNS配置中。这将把_acme-challenge子域的控制权委托给ACME dns服务,这将允许acme-dns-certbot设置所需的dns记录来验证证书请求。

如果您使用DigitalOcean作为您的域名服务提供商,您可以在您的控制面板中设置该域名服务记录:

DigitalOcean DNS控制面板的屏幕截图,显示了ACME DNS的CNAME记录示例

建议将TTL(生存时间)设置为300秒左右,以帮助确保快速传播对记录的任何更改。

配置好DNS记录后,返回Certbot,按Enter验证证书申请并完成颁发过程。

这将需要几秒钟的时间,然后您将看到一条确认证书已颁发的消息:

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...

您已经第一次运行acme-dns-certbot,设置了所需的DNS记录,并成功颁发了证书。接下来,您将设置证书的自动续订。

第四步-使用acme-dns-certbot

在最后一步中,您将使用acme-dns-certbot颁发更多证书并续订现有证书。

首先,现在您已经使用acme-dns-certbot成功颁发了至少一个证书,您可以继续为相同的DNS名称颁发证书,而不需要添加另一个DNSCNAME记录。但是,如果您希望获取不同子域或全新域名的证书,系统会提示您添加另一个CNAME记录。

例如,您可以颁发另一个独立的通配符证书,而无需再次执行验证:

1sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

但是,如果您尝试为子域颁发证书,系统会提示您为该子域名添加CNAME记录:

1sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

这将显示与您在步骤3中执行的初始设置类似的输出:

1[secondary_label Output]
2...
3Please add the following CNAME record to your main DNS zone:
4_acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io.
5
6Waiting for verification...
7...

既然您已经能够使用acme-dns-certbot颁发证书,那么也值得考虑续订过程。

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

1sudo certbot renew

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

要在不等到临近到期日期的情况下测试这是否有效,您可以触发试运行。这将模拟续订过程,而不会对您的配置进行任何实际更改。

您可以使用标准的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 manual, Installer None
 5Renewing an existing certificate
 6Performing the following challenges:
 7dns-01 challenge for your-domain
 8dns-01 challenge for your-domain
 9Waiting for verification...
10Cleaning up challenges
11...

在最后一步中,您发布了另一个证书,然后在Certbot中测试了自动续订流程。

总结

在本文中,您将使用acme-dns-certbot设置Certbot,以便使用DNS验证颁发证书。这释放了使用通配符证书以及管理可能位于负载均衡器后面的大量不同Web服务器的可能性。

请务必关注acme-dns-certbot repository]以获取该脚本的任何更新,因为始终建议运行受支持的最新版本。

如果您有兴趣了解有关acme-dns-certbot的更多信息,您可能希望查看acme-dns项目的文档,该项目是acme-dns-certbot的服务器端元素:

Acme-dns软件也可以是自托管的,如果您在高度安全或复杂的环境中运行,这可能是有益的。

或者,您也可以通过查看官方RFC文档中概述该过程如何工作的相关部分来深入了解ACME DNS验证的技术细节:

Published At
Categories with 技术
comments powered by Disqus