letsencrypt 通配符续约后自动更新 bind9 DNS TXT 条目

letsencrypt 通配符续约后自动更新 bind9 DNS TXT 条目

当更新 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为此内置了相关功能。
自动化的预期方式certbotDNS-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。)

相关内容