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_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
您可以编写自己的处理程序或使用现有的处理程序。有许多可用的处理程序,例如 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 挑战类型。
我还没有看过这个,所以我真的不知道。我的高层次理解只是“我们的 Python 客户端尚不支持 DNS 挑战”。
答案4
正如前面的答案中提到的,您可以使用以下命令通过 DNS 轻松验证域:
- 安装所需的应用程序(在 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
- 为 www.example.com 生成带有手动 DNS 质询确认的证书(替换为您的域名):
./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb