我正在使用 EFF certbot ACME 客户端在我的 Web 服务器上生成单个 TLS 证书,该服务器使用主题备用名称 (SAN) 托管多个域。到目前为止,所有域都托管在特定的 Digital Ocean 团队中,我已使用 Digital Ocean DNS 插件和为该团队创建的个人访问令牌配置了 certbot,以生成具有多个域(包括通配符域)的证书。
现在,客户希望我还为他们想要完全控制的域名提供服务,因此我们创建了一个新的 Digital Ocean 团队,并且我的 DO 个人访问令牌创建帐户已被授予访问权限。不幸的是,我还发现个人访问令牌是为一个团队创建的,不能与其他团队一起使用。
我查看了 certbot 文档,但找不到如何为同一个 SAN 证书的不同域配置不同的 DO 凭据——这可能吗?
如果不是——您建议采用哪些其他替代方案来实现这个用例?
答案1
这显然不受任何内置身份验证器插件的支持,但可以通过使用“手动挂钩”编写脚本来解决这个问题,然后为每个要验证的域选择生成验证令牌的最佳方法。
我编写了一个手动挂钩脚本,支持验证多个 Digital Ocean 团队/用户中的域,假设您每个团队/用户都有一个个人访问令牌。该脚本可在此处获取:https://gist.github.com/guss77/01f095623a1d2fd00869784554d3e1a5。
要使用它,请确保您已doctl
在某处安装了 Digital Ocean CLI 工具(并在脚本中对其进行配置),并在脚本中设置您的个人访问令牌(该脚本还需要dig
一些我希望在各处都能找到的常见 POSIX shell 工具,尽管在 Linux 之外可能无法很好地工作)。
然后不要使用其中一个插件,而是--dns*
使用:
--preferred-challenges=dns --manual \
--manual-auth-hook /path/to/certbot-hook.sh \
--manual-cleanup-hook /path/to/certbot-hook.sh
尝试进行身份验证时,certbot 将调用此脚本为每个要验证的域创建 DNS 记录 -doctl
在使用每个个人访问令牌扫描可用域列表并选择要创建记录的正确“区域”后,脚本将使用该工具。
不过,我有时对这种方法有疑问,特别是在 DNS 传播时间方面 - certbot 支持 DNS 插件的自定义 DNS 传播等待超时,但不支持手动模式,否则也没有很好的方法来模仿它。
答案2
我相信您只需指定不同的配置文件即可做到这一点。
根据certbot-dns-digitalocean
插件文档凭证在 ini 文件中提供:
--dns-digitalocean-credentials
DigitalOcean 凭证 INI 文件。(必需)
ini 文件包含类似以下内容:
dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff
如果您要为不同的凭据创建不同的文件,则可以通过指定这些不同的文件使插件使用不同的凭据。
例如
certbot certonly \
--dns-digitalocean \
--dns-digitalocean-credentials ~/.secrets/certbot/digitalocean-foo.ini \
-d domain1.example
和
certbot certonly \
--dns-digitalocean \
--dns-digitalocean-credentials ~/.secrets/certbot/digitalocean-bar.ini \
-d domain2.example
将使用来自两个单独文件的凭证。