我们使用两个 DNS 提供商来实现冗余。自 2016 年 DynDNS DDOS 攻击以来,我认为我们并不是唯一一家这样做的公司。
我正在尝试使用 Let's Encrypt certbot 进行 DNS 质询。拥有两个 DNS 提供商似乎会带来问题。作为质询过程的一部分,两个 DNS 提供商是否都需要使用相同的 TXT 记录进行更新?
真正的问题是,Let's Encrypt ACME 证书颁发机构 (CA) 如何验证 DNS TXT 条目?它是否像任何客户端一样简单地查询公共 DNS,还是查询映射到我正在使用的 certbot 插件的特定 DNS 提供商?我怀疑是前者。
我尝试仅使用其中一个插件创建证书。TXT 条目已创建,但验证失败。我估计我需要更新两个 DNS 提供商(或者弄清楚如何链接两个提供商,以便它们同步更改)。
文档似乎没有表明可以使用多个相同类型的插件,尽管我还没有尝试过。我的一个提供商要求我升级才能访问他们的 API。
如果无法链接多个身份验证插件,那么我相信自动续订的唯一选项是使用带有自定义脚本的前置和后置挂钩来修改两个 DNS 提供程序。
在我进行所需的工作和费用(或选择手动管理续订过程)之前,我希望得到这一点的确认。
编辑:我知道 StackExchange 编写并发布了自己的开源 DNS 更新程序,域名控制,可用于前挂钩脚本和后挂钩脚本。但是,我们的某个提供商不受支持。
答案1
有许多第三方 ACME (LetsEncrypt) 客户端提供比默认 certbot 更多的功能。他们在其网站上维护一个列表: ACME 客户端实现
其中许多都具有某种 DNS 插件架构,有些允许您为证书中的不同名称指定不同的插件。但据我所知,没有一个允许您按区域组合插件(这样多个插件就可以为单个区域的 TXT 记录提供服务)。
但是,如果你已经考虑编写前置/后置钩子来完成此操作。我建议使用类似acme.sh。它有大量预先编写的 DNS 插件。您可以相当轻松地将两个或多个插件组合成一个合并插件,从而有效地实现您的目标。
答案2
Letsencrypt 仅通过查询随机解析器来验证您的 TXT 条目,而根本不控制将使用哪一个名称服务器。
- letsencrypt/boulder/bdns/dns.go
选定的服务器:= dnsClient.服务器[rand.Intn(len(dnsClient.服务器))]
我建议您将_acme-challenge.example.com.
区域委托给一个您可以自动访问的 DNS 提供商。您的任何 DNS 提供商都不会出现 DoS 情况,这种情况发生的时间不会超过更改此设置所需的时间 - 或者超过 letsencrypt 证书的有效期。因此,可以只跳过 ACME 的冗余,这样您就可以像添加更多名称服务器之前一样使用所有自动化功能。
根据评论进行编辑:此策略不允许继续使用 certbot因为相应的 certbot 插件无法正确处理别名或委托的验证域。它应该尝试修改验证记录的区域,但却尝试修改已验证域的区域,而忽略了它是否有效以及它们是否不同。
其他 acme 客户端可能需要明确说明验证记录的位置,就像 acme.sh 的情况一样