Answers:
当前,还可以在手动模式下使用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_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。
如果您想自动化DNS挑战验证,目前无法使用vanila certbot进行。更新:使用Certbot挂钩可以实现一些自动化。
因此,我们创建了一个简单的插件,该插件支持DNS自动化脚本编写。它可以作为certbot-external-auth使用。
pip install certbot-external-auth
它支持DNS,HTTP,TLS-SNI验证方法。您可以在处理程序模式或JSON输出模式下使用它。
在处理程序模式下,certbot +插件调用外部挂钩(程序,shell脚本,python等)以执行验证和安装。在实践中,您编写了一个简单的处理程序/ shell脚本,该脚本获取输入参数-域,令牌并在DNS中进行更改。处理程序完成后,certbot照常进行验证。
这给您额外的灵活性,也可以续订。
处理程序模式也与脱水 DNS挂钩(以前的letsencrypt.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两步验证,即将推出。
certbot certonly --preferred-challenges dns -d example.com
对初始请求使用手动方法()。测试并切换A记录后,请使用通用的webroot方法(certbot certonly webroot -d example.com -w /path/to/webroot
),并使用与以前完全相同的域名。如果正确完成,certbot将识别现有的证书/配置并更新更新设置,因此将来会自动更新证书。
我能够使用dehydrated
客户端使用DNS验证来获取证书。
https://github.com/lukas2511/脱水
./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
route53.rb
钩子脚本中定义的一些gem依赖项。
截止到今天,官方客户端还不支持DNS-01挑战类型。
我没有看这个,所以我真的不知道。我的高级理解只是“我们的Python客户端尚未支持DNS挑战”。
我为letencrypt.sh客户端编写了一个挂钩脚本,该脚本允许您对不提供api的DNS提供程序使用Lets Encrypt DNS验证(aka,需要手动输入和验证)。
您可以在这里查看:https : //github.com/jbjonesjr/letsencrypt-manual-hook
如先前的答案所述,您可以使用以下方法通过DNS轻松验证域:
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
./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
在尝试了不同的组合之后,这对我来说就是使用脱水和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工具箱来确保其正常工作
~$ dig TXT _acme-challenge.your.domain.com. +short @8.8.8.8
"gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx"
~$
现在,在提示符下按Enter。尽管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
Hugo Landau在Go(https://github.com/hlandau/acme)中编写了一个ACME客户端,该客户端支持DNS挑战(使用BIND的nsupdate协议)。至少18个月以来,对我来说,它一直都运转良好。