深入解析 CAA 错误、成因以及正确配置 CAA 以确保成功签发 SSL 证书

CAA record prevents issuing the certificate SERVFAIL

在申请 SSL 证书的过程中,尤其是在使用 Let’s Encrypt 或 Certbot 等自动化工具时,管理员经常会遇到 “CAA record prevents issuing the certificate: SERVFAIL” 的错误。这类错误并非来自 Web 服务器,而是源于 DNS 层,因为 Let’s Encrypt 的验证从查询 DNS 开始。当此错误出现时,即使服务器配置完美,证书仍无法签发。要解决问题,就必须理解 CAA 记录的本质、Let’s Encrypt 为什么要查询它,以及为什么错误的 DNS 响应会导致证书签发失败。

CAA 的本质及其在证书签发中的作用

CAA(Certificate Authority Authorization)是一种 DNS 记录,用来指定哪些证书颁发机构(CA)被允许为该域名签发证书。当 CA 尝试签发证书时,会先查询 DNS 中的 CAA 记录。如果没有 CAA 记录,CA 会认为没有限制,可以正常签发。但如果存在 CAA 记录且未授权 Let’s Encrypt,或 DNS 响应异常,则签发会被拒绝。

CAA 本质上是一道安全防线,用于防止未授权的证书签发。一些 DNS 提供商会预设 CAA 记录,只允许特定 CA。当用户改用 Let’s Encrypt 时,由于 CAA 未授权,因此出现阻塞。

理解 SERVFAIL 及其产生原因

在所有 CAA 相关错误中,SERVFAIL 是最常见且最让人困惑的错误。很多管理员误以为它来自服务器配置,但实际上这是 DNS 错误。SERVFAIL 表示权威 DNS 服务器未能正确响应 CAA 查询。这可能由 NS 配置错误、DNS 软件故障、DNS 传播延迟、CAA 格式无效等原因导致。

Let’s Encrypt 要求 DNS 返回明确且可验证的结果。如果 DNS 不能返回有效信息,Let’s Encrypt 会认为存在安全风险,从而拒绝签发证书。

一些免费或低质量的 DNS 服务无法正确处理 CAA 查询,使得所有通配符证书请求都失败。

为什么通配符证书更容易触发问题

使用通配符证书(如 *.domain.com)时,Let’s Encrypt 必须使用 DNS-01 验证,这使 DNS 的稳定性变得极其重要。如果 DNS 不稳定,TXT 记录无法及时写入,CAA 查询失败,证书验证自然无法通过。

因此,要成功签发通配符证书,必须确保 DNS 完全正常、CAA 配置正确、NS 配置没有冲突。

正确配置 CAA 的方法

要允许 Let’s Encrypt 签发证书,可以在 DNS 中加入以下 CAA 记录:

0 issue "letsencrypt.org"

如果需要通配符证书,可以加入:

0 issuewild "letsencrypt.org"

如果不需要限制 CA,则可以直接删除所有 CAA 记录,让任何 CA 都可以正常签发证书。

除此之外,还必须确保 DNS 整体响应正常。域名只能使用一组权威 NS,不能混用,也不能在 zone 内保留旧的 NS 记录,否则仍会导致 SERVFAIL。

如何在实际环境中修复 SERVFAIL

第一步是确认 DNS 的完整性,包括 NS 设置是否正确、DNS 服务器是否稳定、是否存在过期或冲突的记录。Zone 文件中的 SOA 错误、重复 NS 记录等都会导致 SERVFAIL。

使用 Cloudflare 时最常见的问题是域名注册商未正确更新两条 NS,导致 Let’s Encrypt 查询到旧的 NS 并得到错误响应。Cloudflare 本身不会产生 CAA 问题,因为它自动提供有效的 CAA。

如果 DNS 提供商不支持 CAA 查询,迁移到 Cloudflare 或 AWS Route53 是最有效的解决方式。

优化 DNS,避免未来问题

要保持 DNS 健康,必须确保 NS 设置统一,Zone 信息清晰,无冲突记录。使用通配符证书时尤其依赖 DNS-01 验证,因此 DNS 必须具备快速、稳定的 TXT 更新能力。

通过维护清晰的 DNS 结构和准确的 CAA 规则,管理员不仅能顺利完成证书签发,还能避免因 DNS 引发的各类难以追踪的问题。