如何使用 Let's Encrypt DNS 质询验证?

Pie*_*tti 211 lets-encrypt

Let's Encrypt宣布他们有:

开启对 ACME DNS 挑战的支持

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

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

小智 289

目前可以执行 DNS 验证,也可以使用手动模式下的certbot LetsEncrypt 客户端。自动化也是可能的(见下文)。

手动插件

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

certbot -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns certonly
Run Code Online (Sandbox Code Playgroud)

然后,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
Run Code Online (Sandbox Code Playgroud)

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

您还可以使用带有更多选项的命令来最小化交互性和回答 certbot 问题。请注意,手动插件尚不支持非交互模式。

certbot --text --agree-tos --email you@example.com -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns --expand --renew-by-default  --manual-public-ip-logging-ok certonly
Run Code Online (Sandbox Code Playgroud)

续订不适用于手动插件,因为它在非交互模式下运行。官方 certbot文档中的更多信息。

更新:手动挂钩

在新的 certbot 版本中,您可以使用hooks,例如--manual-auth-hook, --manual-cleanup-hook. 挂钩是由 certbot 执行以执行任务的外部脚本。

信息在环境变量中传递 - 例如,要验证的域、质询令牌。变量:CERTBOT_DOMAIN, CERTBOT_VALIDATION, CERTBOT_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
Run Code Online (Sandbox Code Playgroud)

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

有关官方 certbot hooks 文档的更多信息。

自动化、更新、脚本

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

因此,我们创建了一个简单的插件,支持使用 DNS 自动化编写脚本。它可以作为certbot-external-auth 使用

pip install certbot-external-auth
Run Code Online (Sandbox Code Playgroud)

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

处理程序模式

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

这为您提供了额外的灵活性,也可以续订。

处理程序模式也与脱水DNS 挂钩(以前的letsencrypt.sh)兼容。已经有许多通用提供商(例如 CloudFlare、GoDaddy、AWS)的 DNS 挂钩。在存储库中有一个包含大量示例和示例处理程序的 README。

带有脱水DNS 钩子的示例:

certbot \
    --text --agree-tos --email you@example.com \
    --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 
Run Code Online (Sandbox Code Playgroud)

JSON 模式

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

certbot \
    --text --agree-tos --email you@example.com \
    --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"}
Run Code Online (Sandbox Code Playgroud)

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

这支持从中央管理服务器进行自动化和证书管理。对于安装,您可以通过 SSH 部署证书。

有关更多信息,请参阅certbot-external-auth GitHub上的自述文件和示例。

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

编辑:我们目前致力于 Ansible 2 步验证,很快就会关闭。

  • 将网站迁移到另一台服务器时,您可能需要在切换 A 记录之前获得新证书。您可以使用手动方法(`certbot certonly --preferred-challenges dns -d example.com`)进行初始请求。测试并切换A记录后,使用与之前完全相同的域名,使用常见的webroot方法(`certbot certonly webroot -d example.com -w /path/to/webroot`)。如果操作正确,certbot 将识别现有证书/配置并更新续订设置,因此将来会自动续订证书。 (2认同)
  • 续订过程是否每次都需要新的 TXT 记录? (2认同)

小智 42

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

https://github.com/lukas2511/dehydred

./dehydrated --cron --domain my.domain.example.com --hook ./hook.route53.rb --challenge dns-01
Run Code Online (Sandbox Code Playgroud)

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

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


Sim*_*tti 11

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

请参阅https://community.letsencrypt.org/t/status-of-of-of-ficial-letsencrypt-clients-dns-01-challenge-support/9427

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

您可以在此 PR 中关注进度。或者,有一些客户端已经支持它。

  • https://twitter.com/letsencrypt/status/689919523164721152 现在可以了。 (3认同)

小智 5

我为letsencrypt.sh 客户端编写了一个钩子脚本,它允许您对不提供 API 的 DNS 提供商使用 Lets Encrypt DNS 验证(也就是需要手动输入和验证)。

你可以在这里查看:https : //github.com/jbjonesjr/letsencrypt-manual-hook