我希望将 Let's Encrypt 用于多个域和子域以及我的公司。我们的目标是使用短期和特定的证书,而不是购买安装在每台机器上的长期通配符证书。这是为了防止一台机器受到攻击时我们的信息被泄露。
不幸的是,有些服务器不能有任何服务中断(也就是说,没有 HTTP acme 挑战的能力)。所以最后一个选项是 DNS 挑战。这需要我们的 DNS 提供商(在本例中为 Cloudflare)的 API 令牌。
但是,如果我将 Global API Token 放在机器上,并且它被破解了,那么攻击者就可以完全访问整个域的 DNS。这正是我想通过不使用通配符证书来缓解的问题。
Cloudflare 允许您创建权限较低的令牌,但它们的粒度不会比每个根级域更细。同样,本质上与通配符证书具有相同的访问权限/关注点。
有谁能解决这个问题吗?
答案1
我过去针对这一要求所采取的方法,以及我相信得到 Let's Encrypt 文档的认可,可以将_acme-challenge
您想要验证的名称的子域名 CNAME 到一个或多个其他区域中具有不同访问控制配置的名称。
例如,如果您希望允许某些服务仅为 生成证书bobservice.example.com
,则可以为其他域(例如 )创建一个单独的区域,bobservice.example
然后将 CNAME_acme-challenge.bobservice.com
设置为_acme-challenge.bobservice.example
。质询令牌随后被放置在 上的 TXT 记录中_acme-challenge.bobservice.example
,LE 跟随 CNAME,然后验证名称。
当然,另一种选择是完全不再使用 Cloudflare,因为他们的服务缺少有限范围凭证等有用的功能,而且还有一个小问题,就是他们为互联网上的败类提供服务。
答案2
不幸的是,有些服务器不能有任何服务中断(也就是说没有 HTTP acme 挑战的能力)。所以最后的选择是 DNS 挑战。
对于你这种情况,还有另一种选择,webroot 插件。这样您就可以告诉 Let's Encrypt 客户端您服务器的 Web 根目录的路径,它会将 HTTP 质询文件放在那里。这种方法不会对您的 Web 服务器造成任何干扰,也不会导致停机。
答案3
我的解决方案是构建一个位于内部网络上、完全锁定且拥有全局 API 密钥的服务。此服务将使用此密钥为各个子域创建/续订证书。依赖子域证书的服务器将拥有一个针对此内部服务的每个域的令牌,它们可以向该内部服务发出该令牌以检索新证书或续订证书。