当更新 wildcard-letsencrypt-certificate 时,您会被要求部署一个带有某种哈希值的 DNS TXT 记录,然后才能继续验证。
像这样:
Please deploy a DNS TXT record under the name
_acme-challenge.my-domain.com with the following value:
fsLb985adfK4wO1jdawkawgk-4QPTTE3k8x110
Before continuing, verify the record is deployed.
通常我会手动更改条目,但我尝试使其自动化...因此我编写了一个 bash 脚本,它首先启动 certbot - 将输出通过管道传输到 tmpfile - 从文件中剪切出所需的哈希值 - 将其作为变量保存 - 然后将变量传递给 python 脚本,然后更新我的绑定区域文件。
有点像这样:
certbot -d *.my-domain.com --server https://acme-v02.api.letsencrypt.org/directory --manual --manual-public-ip-logging-ok --preferred-challenges dns certonly > /tmpfile
keystring=$(grep -A 2 '_acme-challenge.my-domain.com with the following value:' /tmpfile | cut -d':' -f2-)
python update-bind-my-domain-wildcard.py $keystring
它可以工作......但不像我预期的那样......如果我用 dig 查找 acme-challange 条目,我可以看到修改后的 TXT 记录 - 但因此我首先启动 certbot,然后用 dnspython 更新我的区域文件 - letsencrpyt 的验证过程失败。
Dig 请求(@localhost 和 @1.1.1.1):
;; ANSWER SECTION:
_acme-challenge.my-domain.com. 300 IN TXT "fsLb985adfK4wO1jdawkawgk-4QPTTE3k8x110"
Letsencrypt 验证失败:
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. my-domain.com (dns-01): urn:ietf:params:acme:error:unauthorized :: The client lacks sufficient authorization :: Incorrect TXT record "o7dawgrh3234jTcB9YH-lbI-dEYfdawfFWsRoY" found at _acme-challenge.my-domain.com
...其中“o7dawgrh323xxx”条目是旧的(运行更新之前)DNS TXT值...
所以我的问题是,在我的 DNS 更新完成后,是否有可能跳过初始验证并进行某种“仅 certbot 验证”?或者是否有可能摆脱 certbot 更新,先处理脚本的其余部分,然后在脚本的其余部分完成后再返回到第一次验证?或者也许还有一种我还没有想到的更好/更简单的方法?
提前致谢
C333D
答案1
虽然这不是对问题的直接回答,但我认为在对这个问题的讨论中已经达成了更好的解决方案。
Let's Encrypt 整体上以自动化为中心,并certbot
为此内置了相关功能。
自动化的预期方式certbot
DNS-01 验证是使用他们的插件接口。
certbot
还附带了许多适用于各种类型 DNS 服务的现成插件:
- certbot-dns-cloudflare
- certbot-dns-cloudxns
- certbot-dns-digitalocean
- certbot-dns-dnsimple
- certbot-dns-dnsmadeeasy
- certbot-dns-google
- certbot-dns-linode
- certbot-dns-luadns
- certbot-dns-nsone
- certbot-dns-ovh
- certbot-dns-rfc2136
- certbot-dns-route53
该certbot-dns-rfc2136
插件适合与支持 RFC2136 动态更新的常见内部名称服务器(包括 BIND)一起使用。
示例命令可能如下所示:
certbot certonly \
--dns-rfc2136 \
--dns-rfc2136-credentials ~/.secrets/certbot/rfc2136.ini \
-d example.com
该~/.secrets/certbot/rfc2136.ini
文件指定了凭据,如下所示:
dns_rfc2136_server = 192.0.2.1
dns_rfc2136_port = 53
dns_rfc2136_name = letsencrypt-example.
dns_rfc2136_secret = XNinzY9ff5u01DSgM+a34TXHM6D4DSLCdjFyp98NFVA=
dns_rfc2136_algorithm = HMAC-SHA256
(您显然会使用例如来生成您自己的 TSIG 密钥tsig-keygen example-key
。)