证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界

ACME 自动续期把证书过期事故变成了低频事件,但 DNS-01 的 CNAME 委托一旦失效或被误改,问题往往在深夜才暴露。本文拆解委托配置的真实风险点与日常核对方法,帮你把续期事故挡在告警之前。

本文目录
证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界

证书过期导致线上 5xx 的告警,很多团队这几年见得少了。ACME 自动续期普及之后,"忘了续证书"基本成了历史。但另一类事故悄悄补上了位置:自动续期本身悄悄失效,而你没有监控它。

最典型的场景出现在用 DNS-01 验证的团队里。

DNS-01 委托为什么会断

证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:DNS ownership verification using a delegated CNAME, shown as a precise handoff between two controlled zones
证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:DNS ownership verification using a delegated CNAME, shown as a precise handoff between two controlled zones查看原图

用 DNS-01 签发证书时,常见做法是把 _acme-challenge.example.com 通过 CNAME 委托到一个专门用于验证的 DNS 区域,由 ACME 客户端写入 TXT 记录完成挑战。这样主域名所在的 DNS 不用暴露 API 凭据,安全上是合理的取舍。

但这个 CNAME 记录非常"安静"。它不承载业务流量,解析错了用户也感知不到。可能出现的情况包括:

  • 有人清理 DNS 记录时,看到一条看不懂的 _acme-challenge CNAME,顺手删了。
  • 委托目标区域被迁移或下线,CNAME 指向了一个不存在的主机名。
  • 验证专用 DNS 的 API 凭据过期或被回收,客户端写不进 TXT 记录。
  • 更换 DNS 服务商时只迁了业务记录,漏掉了这条委托。

任何一种发生,结果都一样:到期前自动续期失败。如果续期重试窗口和告警都没配好,下一次见到它就是证书过期的线上事故。讽刺的是,HTTP-01 出问题往往能较快暴露(站点直接访问异常),DNS-01 断掉反而更隐蔽——像烟雾报警器的电池,没电的时候安安静静。

证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:an ACME request being validated at separate stations and turned into a new deployable artifact while private key material remains at its origin
证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:an ACME request being validated at separate stations and turned into a new deployable artifact while private key material remains at its origin查看原图

凭据边界:委托的真正价值

反过来说,CNAME 委托最大的安全收益是缩小凭据爆炸半径。如果让 ACME 客户端直接拿主域 DNS 的管理权限,凭据一旦泄露,攻击者可以改的不只是一条 TXT,而是整个域的 A 记录、MX 记录。委托之后,签发系统只需要掌握验证专用区域的写权限,泄露的影响面被限制在"能伪造该域名的证书"——这仍然严重,但远比"能接管整个域名"可控。

所以处置思路不是放弃 DNS-01,而是把它当成一个需要维护的小系统:

证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:a new certificate version moving from its source to several edge appliances while the previous working version remains ready for rollback
证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:a new certificate version moving from its source to several edge appliances while the previous working version remains ready for rollback查看原图
  • 委托目标使用独立的、访问面最小的 DNS 账户或区域,凭据只给签发客户端用。
  • 对 _acme-challenge 这条 CNAME 做变更管控,或者在 DNS 管理流程里加一条注释说明它的用途,防止被当作垃圾记录清理。
  • 监控续期结果本身,而不是只监控证书到期时间。证书还有 30 天到期但续期已经连续失败,这个状态应该触发告警,而不是等最后几天。

在 CertbotX 中实践

CertbotX 支持 DNS-01 的 CNAME 委托模式:验证 TXT 记录写入委托的 DNS 区域,主域 DNS 不需要暴露管理凭据。签发完成后由 ACME 自动在到期前重新签发,并可自动部署到 Agent、EdgeOne 或其他 CDN 目标。每次签发和部署都会留下部署记录,审计时可以回看某张证书什么时候、因为什么原因被推到哪个端点——这对排查"续期到底断在哪一环"很有用,比翻客户端日志快得多。

需要提醒的一点是:自动化能替你执行续期,但不能替你判断委托链路是否还健康。建议定期手动跑一次 dry-run 或检查委托区域的 TXT 写入是否正常,把这条安静的小链路也纳入巡检。

证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:an approaching certificate expiry being detected early, followed by a fresh request and a safe replacement before the live connection is interrupted
证书续期前夜才发现 DNS-01 委托断了:自动签发里最容易被忽视的安全边界:an approaching certificate expiry being detected early, followed by a fresh request and a safe replacement before the live connection is interrupted查看原图

顺便说密钥

聊到证书生命周期就绕不开私钥。自动续期流程里,新证书的私钥通常由客户端本地生成,这没问题;但要确认私钥文件的权限(仅属主可读)和存放位置没有被部署脚本顺手打进了镜像、制品库或日志。证书本身可以公开,私钥不行——这个区别在自动化链路长起来之后,反而更容易被忽略。

最后留一个核验入口:

← 返回资讯中心