DNS CAA(Certification Authority Authorization)记录是一种 DNS 记录类型,用于声明哪些证书颁发机构(CA)可以为特定域名颁发 SSL/TLS 证书。作为域名所有者,通过配置 CAA 记录,可以有效防止未经授权的证书被颁发,保护网站安全。

什么是 CAA 记录

CAA 记录于 2013 年在 RFC 6844 中定义,允许域名管理者明确指定允许为该域名颁发证书的 CA。CAA 记录的工作原理是:当 CA 收到证书申请时,会查询域名的 DNS CAA 记录,如果发现没有授权给自己,则拒绝颁发证书。

CAA 记录的作用

  • 防止证书被冒领:阻止未经授权的 CA 为你的域名颁发证书
  • 提升安全等级:确保只有指定的 CA 可以提供证书服务
  • 审计追踪:CAA 记录可以要求 CA 在颁发证书时发送通知

CAA 记录格式详解

CAA 记录的基本格式如下:

1
CAA <flags> <tag> <value>

关键字段

字段 说明
flags 8 位标志字段,目前使用 bit 0(关键位)
tag 标签,指定 CAA 记录的类型的
value 标签对应的值

常用标签

CAA 记录支持多种标签,常用的包括:

标签 说明 示例
issue 授权指定 CA 颁发证书 issue "letsencrypt.org"
issuewild 授权颁发通配符证书 issuewild "letsencrypt.org"
iodef 指定违规报告发送地址 iodef "mailto:admin@example.com"

flags 字段说明

  • bit 0(关键标志):当设置为 1 时,如果 CA 不识别该标签或不支持该标签,必须停止颁发证书
  • 其余位保留,必须设置为 0

配置 CAA 记录

基本配置示例

以下示例展示如何配置 CAA 记录,只允许 Let’s Encrypt 颁发证书:

1
example.com.  IN CAA 0 issue "letsencrypt.org"

允许多个 CA

如果需要允许多个 CA 颁发证书,添加多条 CAA 记录:

1
2
example.com.  IN CAA 0 issue "letsencrypt.org"
example.com.  IN CAA 0 issue "digicert.com"

允许通配符证书

单独授权通配符证书颁发权限:

1
2
example.com.  IN CAA 0 issue "letsencrypt.org"
example.com.  IN CAA 0 issuewild "letsencrypt.org"

配置违规通知

添加 iodef 标签,当有人尝试违反 CAA 策略时,CA 会发送通知:

1
2
example.com.  IN CAA 0 issue "letsencrypt.org"
example.com.  IN CAA 0 iodef "mailto:security@example.com"

部分 CA 还支持 HTTP/HTTPS 方式的回调:

1
example.com.  IN CAA 0 iodef "https://example.com/caa-report"

使用 dig 查看 CAA 记录

查询域名 CAA 记录

使用 dig 命令查询目标域名的 CAA 记录:

1
dig CAA example.com

输出示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
; <<>> DiG 9.18.1 <<>> CAA example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12345
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.            IN    CAA

;; ANSWER SECTION:
example.com.        86400    IN    CAA    0 issue "letsencrypt.org"
example.com.        86400    IN    CAA    0 issuewild "letsencrypt.org"
example.com.        86400    IN    CAA    0 iodef "mailto:admin@example.com"

简洁输出格式

使用 +short 参数获取简化输出:

1
dig CAA +short example.com

输出:

1
2
3
0 issue "letsencrypt.org"
0 issuewild "letsencrypt.org"
0 iodef "mailto:admin@example.com"

常见配置场景

只允许特定 CA

1
2
3
4
5
6
7
8
# 只允许 Let's Encrypt
example.com.  IN CAA 0 issue "letsencrypt.org"

# 只允许 DigiCert
example.com.  IN CAA 0 issue "digicert.com"

# 只允许 Amazon Trust Services
example.com.  IN CAA 0 issue "amazon.com"

完全禁止颁发证书

如果某个域名不再需要 HTTPS,可以设置完全禁止证书颁发:

1
2
# 0 issue ";" 表示不允许任何 CA 颁发证书
example.com.  IN CAA 0 issue ";"

这种配置下,任何 CA 都应该拒绝为该域名颁发证书。

允许所有 CA

如果不限制 CA,不需要添加 CAA 记录。但从安全角度,建议至少指定一个可信 CA。

CAA 记录的验证机制

CA 的验证流程

  1. 查询 DNS:CA 在收到证书申请后,会查询域名的 CAA 记录
  2. 检查授权:如果存在 CAA 记录,CA 检查自己是否被授权
  3. 处理违规:如果未授权,CA 必须拒绝颁发证书或发送违规报告

关键标志的影响

当 CAA 记录中 flags 的 bit 0 设置为 1(关键标志)时:

  • 如果 CA 不理解某个 tag,必须终止证书颁发流程
  • 这确保了域名所有者的安全策略不会被忽略

验证失败场景

以下情况会导致 CA 拒绝颁发证书:

  • 域名存在 CAA 记录,但未授权该 CA
  • CAA 记录设置了关键标志,但 CA 不支持某个标签
  • DNS 查询失败(部分 CA 会拒绝继续)

注意事项

继承规则

CAA 记录遵循 DNS 区域的继承规则:

  • 子域名会继承父域名的 CAA 策略
  • 子域名可以覆盖父域名的设置

例如,为 sub.example.com 设置独立的 CAA 记录不会影响 example.com 的设置。

生效时间

CAA 记录的修改需要时间传播到全球 DNS 服务器。通常需要几分钟到几小时不等。在修改 CAA 记录后,建议等待 24-48 小时后再申请新证书。

自动化工具

部分 CA 提供 CAA 记录自动检测工具,帮助验证配置是否正确:

1
2
# 使用 sslyze 检测
sslyze --certinfo example.com

总结

DNS CAA 记录是保护域名证书安全的重要手段。通过正确配置 CAA 记录,可以:

  • 限制只有可信的 CA 才能为域名颁发证书
  • 防止证书被意外或恶意颁发
  • 接收违规通知,及时发现安全问题

建议所有运营 HTTPS 服务的域名都配置 CAA 记录,选择一个可信的 CA 并明确授权。

参考来源