让我们加密宣布他们已经:


启用了对ACME DNS挑战的支持


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

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

评论

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

#1 楼

当前,也可以使用certbot LetsEncrypt客户端以手动模式执行DNS验证。也可以实现自动化(请参见下文)。
手动插件
您可以执行手动验证-使用手动插件。
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 hooks文档的更多信息。
自动化,续订,脚本编写
如果您想自动化DNS挑战验证,目前无法实现与香草certbot。更新:可以通过certbot挂钩实现一些自动化。
因此,我们创建了一个简单的插件,该插件支持DNS自动化的脚本编写。它可以作为certbot-external-auth使用。
pip install certbot-external-auth

它支持DNS,HTTP,TLS-SNI验证方法。您可以在处理程序模式或JSON输出模式下使用它。
处理程序模式
在处理程序模式下,certbot +插件调用外部挂钩(程序,shell脚本,Python等)以执行验证和安装。实际上,您编写了一个简单的处理程序/ shell脚本,该脚本获取输入参数-域,令牌并在DNS中进行更改。处理程序完成后,certbot照常进行验证。
这为您提供了更大的灵活性,也可以进行续订。
处理程序模式也与脱水DNS挂钩(以前的letencrypt.sh)兼容。常见提供商(例如CloudFlare,GoDaddy,AWS)已有许多DNS挂钩。存储库中有一个自述文件,其中包含大量示例和示例处理程序。
带脱水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对象。这样可以实现更复杂的集成-例如,当Ansible或某个Deployment Manager调用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-external-auth GitHub上的自述文件和示例。
编辑:还有一个新的博客文章描述了DNS验证问题,并插件的用法。
编辑:我们目前正在进行Ansible两步验证,很快就会停用。

评论


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

– marcovtwout
17年5月10日在12:48

它有效,当心EC2级别的AWS Firewall

– jruzafa
17年7月12日在15:44

我肯定想知道--manual-public-ip-logging-ok的意思是什么....该文档对此并不明确,使用该示例的所有示例都无法解释...包括该示例。

– Rondo
18年6月17日在23:33

续订过程是否每次都需要新的TXT记录?

–老盖泽
18年7月12日在5:50

@Rondo当您以交互方式使用手动模式请求证书时,将显示以下提示:“注意:此计算机的IP将公开记录为已请求此证书。如果您在非手动模式下的计算机上以手动模式运行certbot,您的服务器,请确保您还可以。”此选项对该提示说是。

–muru
19年8月1日在9:24

#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-挂钩

评论


这对我来说真的很好。我唯一要说明的是,我必须安装在route53.rb钩子脚本中定义的一些gem依赖项。

– jmreicha
16年8月8日在18:03

与certbot相比,脱水似乎更易于使用,简单,坚固且轻巧,谢谢!

– Alek_A
7月14日7:12

#3 楼

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

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


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


您可以关注此PR的进展。另外,有些客户已经支持它。

评论


twitter.com/letsencrypt/status/689919523164721152现在就可以了。

–foo
19年4月9日在12:47

#4 楼

我为letencrypt.sh客户端编写了一个挂钩脚本,该脚本允许您对不提供api的DNS提供程序使用Lets Encrypt DNS验证(aka,需要手动输入和验证)。

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

#5 楼

如先前的答案所述,您可以使用以下方法通过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



#6 楼

在尝试了不同的组合之后,这就是使用脱水和letencrypt-man-hook 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中创建TXT记录。通过运行以下命令或GSuite工具箱确保其正常工作。现在,在提示符下按Enter。尽管TXT记录已更新,但是这对我不起作用。我必须按Ctrl + C并再次运行命令。

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


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

要续订(最少等待时间为30天),只需再次执行同一命令即可。

~$ ./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!
~$


评论


我也喜欢脱水,只是想提一下,它通常包含在大多数发行版的标准存储库中(例如,脱水安装apt安装)。

– Alek_A
7月14日7:14



#7 楼

Hugo Landau在Go(https://github.com/hlandau/acme)中编写了一个ACME客户端,该客户端支持DNS挑战(使用BIND的nsupdate协议)。至少18个月以来,它对我来说就一直运转良好。

#8 楼

在certbot中使用--manual-auth-hook--manual-cleanup-hook时,很容易实现。

certbot-auto --manual --preferred-challenges dns --manual-auth-hook auth.sh --manual-cleanup-hook cleanup.sh -d your.domain.com -d *.wildcard.domains.com`


其中auth.sh类似于

#!/bin/sh

KEYFILE=tsig_key_file

nsupdate -k $KEYFILE <<EOT
server ns.some-domain.com
update add _acme-challenge.$CERTBOT_DOMAIN 60 txt $CERTBOT_VALIDATION
send
EOT

# wait a few seconds to let the change take effect
sleep 5


cleanup.sh类似

#!/bin/sh

KEYFILE=/opt/certbot-authenticator/tsig

nsupdate -k $KEYFILE<<EOT
server dns-master
update del _acme-challenge.$CERTBOT_DOMAIN
send
EOT


,前提是您的dns服务器已正确配置为允许动态dns更新(RFC2136)。强烈建议使用TSIG密钥,但是如果您选择不使用它,则在调用-k $KEYFILE时仅剪切nsupdate选项即可。