题 如何使用Let的加密DNS质询验证?


我们加密了 公布 他们有:

转而支持ACME DNS挑战

我该怎么做 ./letsencrypt-auto 使用DNS质询域验证生成新证书?

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


122
2018-01-21 22:13




边注: Certbot (这是letsencrypt客户端的新名称)现在默认允许基于webroot的身份验证。 - Pierre Prinetti


答案:


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

手动插件

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

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 you@example.com -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_DOMAINCERTBOT_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挑战验证,目前无法使用vanila certbot。 更新:使用Certbot挂钩可以实现一些自动化。

因此,我们创建了一个支持DNS自动化脚本的简单插件。它可以作为 certbot-外部-AUTH

pip install certbot-external-auth

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

处理程序模式

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

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

处理程序模式也兼容 脱水 DNS挂钩(以前的letsencrypt.sh)。已经有许多针对常见提供商的DNS挂钩(例如,CloudFlare,GoDaddy,AWS)。在存储库中有一个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 

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"}

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

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

有关详细信息,请参阅自述文件和示例 certbot-外部-AUTH GitHub上。

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

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


154
2017-10-29 13:00



将网站迁移到另一台服务器时,您可能需要在切换A记录之前获得新证书。您可以使用手动方法(certbot certonly --preferred-challenges dns -d example.com)对于初始请求。测试并切换A记录后,使用常见的webroot方法(certbot certonly webroot -d example.com -w /path/to/webroot)使用与以前完全相同的域名。如果操作正确,certbot将识别现有的证书/配置并更新续订设置,因此证书将来会自动续订。 - marcovtwout
它有效,谨防EC2级别的AWS防火墙 - jruzafa
我肯定想知道什么--manual-public-ip-logging-ok意味着....文档对它很神秘,所有使用它的例子都没有解释......包括这个。 - Rondo
续订过程每次都需要新的TXT记录吗? - Old Geezer
@OldGeezer显然,确实如此。我开始了这个过程,它要求我创建一个内容与上次不同的TXT记录。 - Dario Fumagalli


我能够使用 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


37
2018-02-18 21:45



这对我来说非常好。我要补充的唯一警告是我必须安装一些定义在中的gem依赖项 route53.rb 钩子脚本。 - jmreicha


截至今天,官方客户端尚未支持DNS-01质询类型(尚未)。

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

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

您可以按照进度进行操作 这个公关。或者,有 一些客户 已经支持它了。


10
2018-01-28 11:34





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

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


5
2018-05-22 16:55





如前面的答案所述,您可以通过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

3
2017-12-16 10:36





尝试不同的组合后,这对我有用 脱水 和 letsencrypt手动挂机 git存储库。如果以下步骤适合您,请不要忘记  这些存储库

注意:这是panticz.de和alexcline的答案的补充

~$ git clone https://github.com/lukas2511/dehydrated.git
~$ git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
~$ cd dehydrated
~$ ./dehydrated --register --accept-terms
~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Creating new directory /Users/vikas/dehydrated/certs/your.domain.com ...
 + Creating chain cache directory /Users/vikas/dehydrated/chains
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Create TXT record for the domain: '_acme-challenge.your.domain.com'. TXT record:
'gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx'
Press enter when DNS has been updated...

您将获得一个哈希(在运行上述命令后),创建一个 文本 记录在您的DNS中。通过运行以下命令或确保它的工作原理 GSuite工具箱

~$ dig TXT _acme-challenge.your.domain.com. +short @8.8.8.8
"gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx"
~$

现在,按 输入 在提示。尽管TXT记录已更新,但这对我不起作用。我不得不按Ctrl + C并再次运行命令。

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Found gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx. match.
 + Responding to challenge for your.domain.com authorization...
Challenge complete. Leave TXT record in place to allow easier future refreshes.
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Walking chain...
 + Done!
~$

现在,您的公共和私人证书都在这里。

$ ls certs/your.domain.com/privkey.pem certs/your.domain.com/fullchain-1517576424.pem

要续订(最短等待时间为30天),再次使用相同的命令。

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb

2
2018-02-02 13:44





Hugo Landau在Go写了一个ACME客户端(https://github.com/hlandau/acme)支持DNS挑战(使用BIND的nsupdate协议)。至少18个月,它一直在为我完美运作。


0
2017-07-03 18:07