我正在尝试使用 Certbot 来实现半自动化证书更新。我不想使用全自动更新,以避免自动证书替换(这可能会中断业务),并确保在实际完成更新时有一位有感知能力的管理员可以处理潜在的负面后果。因此,我需要能够在与颁发实际续订证书不同的步骤中找出证书是否需要续订。
如何才能快速且无副作用地查明 Certbot 管理的命名证书是否需要续订,而无需触发续订本身?
当我发出renew
命令时,实际的更新会立即触发。
当我使用renew
带有--dry-run
标志的命令时,不会触发续订,但无论证书是否到期,都会触发我的身份验证插件,因为它正在模拟身份验证。由于我使用 DNS 进行身份验证,因此实际更新是通过动态 DNS 发出的,除了在没有管理员值班的情况下再次使用实时系统进行调整外,由于 DNS 的更新传播速度较慢,每次检查也需要相当长的时间。
作为另一种选择,我可以想象使用renew
带有-a
和标志的--dry-run
命令来选择某种无操作身份验证插件,这种插件不会干扰 DNS,也不会花费几分钟才能得到答案。遗憾的是,Certbot 附带了一个无操作安装程序插件,但没有附带无操作身份验证插件。开发这样的无操作身份验证插件似乎并不是一件容易的事,因为身份验证插件的接口似乎需要插件返回实际的Challenge
和对象,而我目前对此了解不足。ChallengeResponse
我是否错过了其他可以解决我的问题的方法?或者是否有某个地方可以使用无操作身份验证插件?
答案1
certbot 将更新证书如果在配置中启用了自动续订,并且证书被撤销,或者距离到期还有一定天数。默认为 30 天。
任何其他证书监控脚本也可以解析revoked和notAfter。
您试图让 certbot 停止执行其操作,这似乎是一项艰巨的工作,但收效甚微。如果插件从未执行过,您如何才能在真正执行之前知道插件是否有效?
考虑逐步建立对自动化的信心。
- 编写一个在证书更新时重新加载服务的方法。可以在 certbot 钩子中使用 Web 服务器的优雅重新加载。可以从主机上耗尽负载平衡连接并重新启动它们。
- 在测试域上以交互方式运行 certbot。使用与实际相同的插件和钩子,但在完全不同的区域上。
- 在操作人员正常唤醒时,在生产域上以交互方式运行 certbot。在日历上预留时间来解决问题。
- 在 cron 中自动运行 certbot。考虑安排在白天,当操作人员及其同事醒着的时候。
在整个过程中,certbot 都会将之前的证书保存在本地。此外,序列号也会保存到公共证书透明度日志中。
Let's Encrypt 的一个优势是它是一家已受到许多 TLS 客户端信任的 CA。在续订期间,主题和根不会改变,只有密钥会改变。这使得续订成为一项易于自动化的常规操作。除非你做了一些你没有描述过的奇特事情,比如密钥固定,但这种情况并不常见。