如何使用 Let's Encrypt DNS-01 挑战验证?

如何使用 Let's Encrypt DNS-01 挑战验证?

Let's Encrypt 有宣布他们有:

开启对 ACME DNS 挑战的支持

如何./letsencrypt-auto使用 DNS 挑战域验证生成新证书?

编辑
我的意思是:如何http/https通过使用新发布的功能(2015-01-20)来避免端口绑定,通过在目标域的 DNS 区域中添加特定的 TXT 记录来证明域所有权?

答案1

目前,也可以使用certbotLetsEncrypt 客户端处于手动模式。也可以实现自动化(见下文)。

手动插件

您可以使用手动插件执行手动验证。

certbot -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns certonly

然后,Certbot 将为您提供说明,以便手动更新域的 TXT 记录以继续验证。

Please deploy a DNS TXT record under the name
_acme-challenge.bristol3.pki.enigmabridge.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

更新 DNS 记录后,按 Enter,certbot 将继续,如果 LetsEncrypt CA 验证了质询,则证书将正常颁发。

您还可以使用具有更多选项的命令来最大限度地减少交互和回答 certbot 问题。请注意,手动插件尚不支持非交互模式。

certbot --text --agree-tos --email [email protected] -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns --expand --renew-by-default  --manual-public-ip-logging-ok certonly

续订不适用于手动插件,因为它以非交互模式运行。更多信息请参阅官方 certbot文档

更新:手动挂钩

在新版 certbot 中,你可以使用钩子,例如,--manual-auth-hook--manual-cleanup-hook钩子是 certbot 执行的外部脚本,用于执行任务。

信息在环境变量中传递 - 例如,要验证的域、质询令牌。变量:CERTBOT_DOMAIN,,CERTBOT_VALIDATIONCERTBOT_TOKEN

certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /path/to/dns/authenticator.sh --manual-cleanup-hook /path/to/dns/cleanup.sh -d secure.example.com

您可以编写自己的处理程序或使用现有的处理程序。有许多可用的处理程序,例如 Cloudflare DNS。

有关官方 certbot 的更多信息钩子文档

自动化、更新、脚本

如果您想自动执行 DNS 质询验证,目前无法使用 vanilla certbot。更新:使用 certbot 钩子可以实现一些自动化。

因此,我们创建了一个支持 DNS 自动化脚本的简单插件。它可用作certbot-外部身份验证

pip install certbot-external-auth

它支持 DNS、HTTP、TLS-SNI 验证方法。您可以在处理程序模式下使用它,也可以在 JSON 输出模式下使用它。

Handler 模式

在处理程序模式下,certbot + 插件会调用外部钩子(程序、shell 脚本、Python 等)来执行验证和安装。实际上,您可以编写一个简单的处理程序/shell 脚本,该脚本获取输入参数 - 域、令牌并在 DNS 中进行更改。处理程序完成后,certbot 会照常进行验证。

这为您提供了额外的灵活性,也可以进行更新。

处理程序模式还兼容脱水DNS 钩子(原 letsencrypt.sh)。目前已有许多针对常见提供商的 DNS 钩子(例如 CloudFlare、GoDaddy、AWS)。存储库中有一个 README,其中包含大量示例和示例处理程序。

例如脱水DNS 钩子:

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    --certbot-external-auth:out-handler ./dehydrated-example.sh \
    --certbot-external-auth:out-dehydrated-dns \
    run 

JSON 模式

另一种插件模式是 JSON 模式。它每行生成一个 JSON 对象。这可以实现更复杂的集成 - 例如,当 Ansible 或某些部署管理器调用 certbot 时。通信通过 STDOUT 和 STDIN 执行。Cerbot 生成带有数据的 JSON 对象以执行验证,例如:

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    certonly 2>/dev/null

{"cmd": "perform_challenge", "type": "dns-01", "domain": "bs3.pki.enigmabridge.com", "token": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4", "validation": "ejEDZXYEeYHUxqBAiX4csh8GKkeVX7utK6BBOBshZ1Y", "txt_domain": "_acme-challenge.bs3.pki.enigmabridge.com", "key_auth": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4.tRQM98JsABZRm5-NiotcgD212RAUPPbyeDP30Ob_7-0"}

一旦 DNS 更新,调用者就会将换行符发送到 certbot 的 STDIN,以表示它可以继续验证。

这样就可以从中央管理服务器实现自动化和证书管理。对于安装,您可以通过 SSH 部署证书。

有关详细信息,请参阅自述文件和示例certbot-外部身份验证GitHub。

编辑:还有一个新的博客文章描述 DNS 验证问题和插件使用情况。

编辑:我们目前正在进行 Ansible 两步验证,很快就会停止。

答案2

我能够使用dehydrated客户端通过 DNS 验证来获取证书。

https://github.com/lukas2511/dehydrated

./dehydrated --cron --domain my.domain.example.com --hook ./hook.route53.rb --challenge dns-01

您需要为您的域使用正确的 DNS 验证挂钩,但有几个选项可作为示例:

https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks

答案3

截至今天,官方客户端还不支持 DNS-01 挑战类型。

https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427

我还没有看过这个,所以我真的不知道。我的高层次理解只是“我们的 Python 客户端尚不支持 DNS 挑战”。

您可以在以下位置跟踪进度:这个 PR. 或者,有一些客户已经支持它了。

答案4

正如前面的答案中提到的,您可以使用以下命令通过 DNS 轻松验证域:

  1. 安装所需的应用程序(在 Ubuntu 下): apt-get install -y git ruby letsencrypt git clone https://github.com/lukas2511/dehydrated.git git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
  2. 为 www.example.com 生成带有手动 DNS 质询确认的证书(替换为您的域名): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

相关内容