RFC 8659:DNS CAA资源记录

RFC 8659
DNS Certification Authority Authorization (CAA)
Resource Record

流: 互联网工程任务组 (IETF)

RFC: 8659

废弃: 6844

类别: 标准跟踪

发布日期: 2019年11月

ISSN: 2070-1721

作者: P. Hallam-Baker Venture Cryptography

R. Stradling Sectigo

J. Hoffman-Andrews Let's Encrypt

(部分内容摘译)

摘要

证书颁发机构授权 (CAA) DNS 资源记录允许 DNS 域名持有者指定一个或多个被授权为该域名颁发证书的证书颁发机构 (CA)。CAA 资源记录允许公共 CA 实施额外控制,以降低意外错误颁发证书的风险。本文档定义了 CAA 记录的语法以及 CA 处理 CAA 记录的规则。

1. 引言

与基于 DNS 的命名实体认证 (DANE) [RFC6698] 中定义的 TLSA 记录类似,CAA 记录用作检查 PKIX [RFC6698] 证书数据机制的一部分。CAA 和 TLSA 之间的区别在于,CAA 记录指定了 CA 在颁发证书之前要执行的授权控制,而 TLSA 记录指定了依赖方在证书颁发后要执行的验证控制。

符合已发布的 CAA 记录是颁发证书的必要条件,但不是充分条件。

一组 CAA 记录仅描述了对相应 DNS 域名颁发证书的当前授权。由于证书在一段时间内有效,可能存在当前发布的 CAA 记录不符合的证书在颁发时符合当时发布的 CAA 记录的情况。依赖方不得将 CAA 记录用作证书验证的一部分。

2. 定义

2.1. 需求语言

本文件中出现的关键词"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY"和"OPTIONAL",如 BCP 14 [RFC2119] [RFC8174] 所述进行解释,仅当它们以全大写字母出现时,如本文所示。

2.2. 定义术语

本文档中使用以下术语:

  • Certificate: 如 [RFC5280] 所规定的 X.509 证书。

  • Certificate Evaluator: 除依赖方外,评估证书颁发机构颁发的证书可信度的一方。

  • Certification Authority(CA): 根据指定的证书策略颁发证书的颁发者。

  • Certificate Policy (CP): 规定 CA 在颁发证书时承诺满足的标准。参见 [RFC3647]。

  • Certification Practices Statement (CPS): 规定实现 CP 标准的方法。在大多数情况下,这将是 CA 运营审计所依据的文档。参见 [RFC3647]。

  • Domain Name: 分配给域名系统中节点的标签。

  • Domain Name System (DNS): [RFC1034] 和 [RFC1035] 中规定的互联网命名系统。

  • DNS Security (DNSSEC): DNS 的扩展,提供 [RFC4033]、[RFC4034]、[RFC4035]、[RFC5155] 以及这些规范的任何修订版中规定的认证服务。

  • Fully Qualified Domain Name (FQDN): 包含 DNS 中所有上级节点标签的域名。

  • Issuer: 颁发证书的实体。参见 [RFC5280]。

  • Property: CAA 资源记录的标签-值部分。

  • Property Tag: CAA 资源记录的标签部分。

  • Property Value: CAA 资源记录的值部分。

  • Relevant Resource Record Set: 将第 3 节的算法应用于特定 FQDN 或通配符域名时产生的一组 CAA 资源记录。

  • Relying Party:: 使用某个应用程序的一方,该应用程序的运行依赖于使用证书来做出安全决策。参见 [RFC5280]。

  • Resource Record (RR): DNS 中的特定条目,包括所有者名称、类别、类型、生存时间和数据,如 [RFC1034] 和 [RFC2181] 所定义。

  • Resource Record Set(RRset): 具有特定所有者名称、类别和类型的一组 RR。RRset 内所有 RR 的生存时间总是相同的,但数据在 RRset 中的 RR 之间可能不同。

  • Wildcard Domain Name通配符域名: 由单个星号字符后跟单个"句点"字符 ("*") 再后跟一个 FQDN 组成的域名。

3. 相关资源记录集RRRSet

在颁发证书之前,合规的 CA 必须MUST 检查是否存在相关的 RRset 发布。如果存在这样的 RRset,CA 不得MUST NOT 颁发证书,除非 CA 确定 (1) 证书请求符合适用的 CAA RRset,或者 (2) 相关 CP 或 CPS 中指定的例外情况适用。如果 FQDN 或通配符域名的相关 RRset 不包含限制颁发的属性标签(例如,如果它只包含 iodef 属性标签或仅包含 CA 无法识别的属性标签),则 CAA 不限制颁发。

证书请求可以MAY 指定多个 FQDN 并可以指定通配符域名。颁发者必须MUST 验证请求中指定的所有 FQDN 和通配符域名的授权。

对 CAA RRset 的搜索从指定的标签开始沿着 DNS 名称树向上查找,直到找到 CAA RRset,但不包括 DNS 根 (".")。

给定对特定 FQDN X 的请求或对通配符域名 *.X 的请求,RRRset RelevantCAASet(X) 按如下方式确定(以伪代码表示):

  • 令 CAA(X) 为根据 [RFC1034] 第 4.3.2 节(特别是遵循别名链)中指定的查找算法,对 FQDN X 执行 CAA 记录查询返回的 RRset。令 Parent(X) 为通过移除 X 的最左侧标签生成的 FQDN。

    RelevantCAASet(domain):
    while domain is not ".":
    if CAA(domain) is not Empty:
    return CAA(domain)
    domain = Parent(domain)
    return Empty

例如,对 FQDN "X.Y.Z" 处理 CAA,假设树中任何级别都没有 CAA 记录,RelevantCAASet 将执行以下步骤:

复制代码
CAA("X.Y.Z.") = Empty; domain = Parent("X.Y.Z.") = "Y.Z."
 CAA("Y.Z.") = Empty; domain = Parent("Y.Z.") = "Z."
 CAA("Z.") = Empty; domain = Parent("Z.") = "."
 return Empty

对 FQDN "A.B.C" 处理 CAA,假设在 "B.C" 处有一条 CAA 记录 "issue example.com",则会在找到该 CAA 记录时提前终止:

复制代码
CAA("A.B.C.") = Empty; domain = Parent("A.B.C.") = "B.C."
 CAA("B.C.") = "issue example.com"
 return "issue example.com"

4. 机制

4.1. 语法

一个 CAA RR 包含一个由标签-值对组成的单一属性。一个 FQDN 可以 MAY 有多个与其关联的 CAA RR,并且给定的属性标签可以MAY 在这些 RR 中多次指定。

CAA RR 的 RDATA 部分包含一个属性。一个属性由以下部分组成:

复制代码
+0-1-2-3-4-5-6-7-|0-1-2-3-4-5-6-7-|
| Flags          | Tag Length = n |
+----------------|----------------+...+---------------+
| Tag char 0     | Tag char 1     |...| Tag char n-1  |
+----------------|----------------+...+---------------+
+----------------|----------------+.....+----------------+
| Value byte 0   | Value byte 1   |.....| Value byte m-1 |
+----------------|----------------+.....+----------------+

其中 n 是标签长度字段中指定的长度,m 是值字段中剩余的八位字节数。它们的关系是 (m=d−n−2),其中 d 是 RDATA 部分的长度。

字段定义如下:

  • Flags: 一个八位字节,包含以下字段:
    -- Bit 0,Issuer Critical Flag: 如果值设置为"1",则该属性是关键属性。如果某个 FQDN 的RRRset 包含一个未知或不受支持的属性标签的 CAA 关键属性,则 CA 不得为该 FQDN 颁发任何证书。

请注意,根据 [RFC1035] 中规定的约定,位 0 是最高有效位,位 7 是最低有效位。因此,根据这些约定,Flags值 1 表示位 7 被设置,而值 128 表示位 0 被设置。

所有其他位位置保留供将来使用。

为确保与 CAA 未来扩展的兼容性,符合此版本 CAA 规范的 DNS 记录必须MUST清除(设置为"0")所有保留的标志位。解释 CAA 记录的应用程序必须忽略所有保留标志位的值。

  • 标签长度Tag Length: 一个包含无符号整数的单八位字节,指定标签的长度(以八位字节为单位)。标签长度必须MUST至少为 1。
  • 标签: 属性标识符------一串 ASCII 字符。

标签可以MAY包含 ASCII 字符"a"到"z"、"A"到"Z"以及数字 0 到 9。标签不得MUST NOT包含任何其他字符。标签匹配不区分大小写。

向 IANA 提交注册的标签不得MUST NOT包含除(小写)ASCII 字符"a"到"z"和数字 0 到 9 以外的任何字符。

  • Value: 表示属性值的八位字节序列。属性值编码为二进制值,并可以MAY采用子格式。

值字段的长度由包含它的 RDATA 部分的剩余长度隐式指定。

4.1.1. 规范表示格式

CAA 记录的规范表示格式为:

复制代码
CAA <flags> <tag> <value>

其中:

  • Flags: 0 到 255 之间的无符号整数。

  • Tag: 非零长度的小写 ASCII 字母和数字序列。

  • Value: 值字段,表示为 (1) 一组内部无空格的连续字符,或 (2) 一个引号字符串。参见 [RFC1035] 第 5.1 节中指定的 格式,但请注意值字段不包含长度字节,并且不受限于 255 个字符。

4.2. CAA issue 属性

如果 issue 属性标签出现在 FQDN 的相关 RRset 中,则表示请求颁发者:

  1. 对该 FQDN 执行 CAA 颁发限制处理,并且
  2. 授予向该 issuer-domain-name 的持有者或在其明确授权下行事的任何一方颁发包含该 FQDN 的证书的授权。

CAA issue 属性值具有以下子语法(根据 [RFC5234] 以 ABNF 指定)。

复制代码
issue-value = *WSP [issuer-domain-name *WSP]
 [";" *WSP [parameters *WSP]]
 
issuer-domain-name = label *("." label)
label = (ALPHA / DIGIT) *( *("-") (ALPHA / DIGIT))

parameters = (parameter *WSP ";" *WSP parameters) / parameter
parameter = tag *WSP "=" *WSP value
tag = (ALPHA / DIGIT) *( *("-") (ALPHA / DIGIT))
value = *(%x21-3A / %x3C-7E)

为了与 DNS 管理的其他方面保持一致,FQDN 值以字母-数字-连字符标签 (LDH-Label) 形式指定。

以下 CAA RRset 请求任何颁发者(除了 ca1.example.netca2.example.org)都不得为 FQDN "certs.example.com" 颁发证书。

复制代码
certs.example.com CAA 0 issue "ca1.example.net"
certs.example.com CAA 0 issue "ca2.example.org"

因为在 FQDN 的相关 RRset 中存在 issue 属性标签会限制颁发,所以 FQDN 所有者可以使用没有 issuer-domain-name 的 issue 属性标签来请求不颁发任何证书。

例如,以下 RRset 请求任何颁发者都不得为 FQDN "nocerts.example.com" 颁发证书。

复制代码
nocerts.example.com CAA 0 issue ";"

如果 issue 属性标签的 issue-value 不匹配 ABNF 语法,则必须将其视为指定了空 issuer-domain-name 的 issue 属性标签来处理。例如,以下格式错误的 CAA RRset 禁止颁发:

复制代码
malformed.example.com CAA 0 issue "%%%%"

CAA 授权是累加的;因此,同时指定一个空的 issuer-domain-name 和一个非空的 issuer-domain-name 的结果与只指定非空的 issuer-domain-name 相同。

颁发者可以MAY选择指定参数来进一步限制由该颁发者颁发证书------例如,指定证书要遵循特定的验证策略、计费到特定账户或在特定的信任锚下颁发。

例如,如果 ca1.example.net 要求其客户 account.example.com 使用(由 CA 定义的)"account"参数在他们客户的每个 CAA 记录中指定他们的账户号码"230123",则看起来会是这样:

复制代码
account.example.com CAA 0 issue "ca1.example.net; account=230123"

issue 属性标签参数的语义由颁发者单独决定。

4.3. CAA issuewild 属性

issuewild 属性标签的语法和语义与 issue 属性标签相同,只是它仅授予颁发指定通配符域名的证书的授权,并且当指定时,每个 issuewild 属性的优先级高于每个 issue 属性。具体来说:

在处理非通配符域名的 FQDN 请求时,必须MUST忽略每个 issuewild 属性。

如果在通配符域名的相关 RRset 中指定了至少一个 issuewild 属性,则处理该通配符域名的请求时必须MUST忽略每个 issue 属性。

例如,以下 RRset 请求只有 ca1.example.net 可以为 "wild.example.com" 或 "sub.wild.example.com" 颁发证书,并且只有 ca2.example.org 可以为 *.wild.example.com 或 *.sub.wild.example.com 颁发证书。注意,这假设没有针对 sub.wild.example.com 的 CAA RR。

复制代码
wild.example.com CAA 0 issue "ca1.example.net"
wild.example.com CAA 0 issuewild "ca2.example.org"

以下 RRset 请求只有 ca1.example.net 可以为 "wild2.example.com"、*.wild2.example.com 或 *.sub.wild2.example.com 颁发证书。

复制代码
wild2.example.com CAA 0 issue "ca1.example.net"

以下 RRset 请求只有 ca2.example.org 可以为 *.wild3.example.com 或 *.sub.wild3.example.com 颁发证书。它不允许任何颁发者为 "wild3.example.com" 或 "sub.wild3.example.com" 颁发证书。

复制代码
wild3.example.com CAA 0 issuewild "ca2.example.org"
wild3.example.com CAA 0 issue ";"

以下 RRset 请求只有 ca2.example.org 可以为 *.wild3.example.com 或 *.sub.wild3.example.com 颁发证书。它允许任何颁发者为 "wild3.example.com" 或 "sub.wild3.example.com" 颁发证书。

复制代码
wild3.example.com CAA 0 issuewild "ca2.example.org"

4.4. CAA iodef 属性

iodef 属性指定了一种报告证书颁发请求或证书颁发情况的方法,当这些请求或颁发违反了颁发者或 FQDN 持有者的安全策略时,对于属性出现在相关 RRset 中的域名进行报告。

事件对象描述交换格式 (IODEF) [RFC7970] 用于以机器可读的形式呈现事件报告。

iodef 属性标签将 URL 作为其属性值。URL 方案类型决定了报告所用的方法:

  • mailto: IODEF 报告作为 MIME 电子邮件附件提交到指定邮件地址的 SMTP 电子邮件。发送的邮件应该包含一个简短的文本消息,以提醒收件人附件的性质。

  • http 或 https: IODEF 报告作为 Web 服务请求,使用 [RFC6546] 中指定的协议提交到指定的 HTTP 地址。

这些是唯一支持的 URL 方案。

以下 RRset 指定可以通过带有 IODEF 数据附件的电子邮件、Web 服务 [RFC6546] 或两者进行报告:

复制代码
report.example.com CAA 0 issue "ca1.example.net"
report.example.com CAA 0 iodef "mailto:security@example.com"
report.example.com CAA 0 iodef "https://iodef.example.com/"

4.5. 关键标志位Critical Flag

关键标志位旨在允许 CAA 的未来版本引入新的语义,这些语义必须被理解才能正确处理记录,防止不理解新语义的合规 CA 为指定的 FQDN 颁发证书。

在以下示例中,属性标签为 "tbs" 的属性被标记为关键。无论 ca1.example.net CA 还是任何其他颁发者,都不得为 "new.example.com"(或这是相关 RRset 的任何其他域名)颁发证书,除非该颁发者已经实现了 "tbs" 属性标签的处理规则。

复制代码
new.example.com CAA 0 issue "ca1.example.net"
new.example.com CAA 128 tbs "Unknown"

5. 安全考量

CAA 记录声明了 FQDN 持有者希望颁发者遵守的安全策略。因此,CAA 记录作为访问控制机制的有效性取决于颁发者对 CAA 约束的遵守。

本文档描述的 CAA 记录属性的目标是降低证书错误颁发的风险,而不是避免依赖已错误颁发的证书。DANE [RFC6698] 描述了一种避免依赖错误颁发证书的机制。

5.1. 使用 DNS 安全性

强烈推荐使用 DNSSEC 来认证 CAA RR,但不是必需的。颁发者不得MUST NOT颁发与其RRRset 冲突的证书,无论相应的 DNS 记录是否经过签名。

DNSSEC 为 DNS FQDN 和 FQDN 内的 RRset 提供了不存在的证明。因此,DNSSEC 验证使颁发者能够确定 CAA 记录查询的答案是 (1) 因为 RRset 为空而返回空,还是 (2) 非空但响应已被抑制。

使用 DNSSEC 允许颁发者获取并归档一份证明,证明他们曾被授权为 FQDN 颁发证书。验证此类档案可能是审核 CAA 记录处理合规性的要求。发布此类档案可能是验证 CAA 记录处理合规性的透明度要求。

5.2. 证书颁发机构的不合规

CAA 记录为 CA 提供了一种经济有效的方法来降低证书错误颁发的风险:实施 CAA 检查的成本非常低,而错误颁发事件的潜在成本包括移除嵌入式信任锚。

5.3. 授权证书颁发机构的错误颁发

使用 CAA 记录不能防止授权 CA(即通过 CAA 记录被授权为相关 FQDN 颁发证书的 CA)的错误颁发。

FQDN 持有者应该验证他们授权为其 FQDN 颁发证书的 CA 是否采用了适当的控制措施,以确保证书仅颁发给他们组织内的授权方。

此类控制措施最适合由 FQDN 持有者和授权 CA 直接确定,因此不在本文档的范围内。

5.4. CAA 记录的抑制或欺骗

抑制 CAA 记录或插入伪造的 CAA 记录可能使攻击者能够从未被授权为受影响 FQDN 颁发证书的颁发者那里获取证书。

在可能的情况下,颁发者应该执行 DNSSEC 验证以检测缺失或被修改的 CAA RRset。

在对相应 FQDN 未部署 DNSSEC 的情况下,颁发者应该尝试通过采用适当的 DNS 安全控制来减轻此风险。例如,DNS 查找过程的所有部分都应该针对权威名称服务器执行。第三方缓存的数据不得被用作 DNS CAA 信息的唯一来源,但可以用于支持额外的反欺骗或反抑制控制。

5.5. 拒绝服务

理论上,引入格式错误或恶意的 CAA RR 可能实现拒绝服务 (DoS) 攻击。这可能通过修改权威 DNS 记录或欺骗传输中的 DNS 响应而发生。

这种特定威胁不被认为会显著增加运行不安全 DNS 服务的风险。

原则上,攻击者可以通过请求具有恶意长 DNS 名称的证书来对颁发者进行 DoS 攻击。实际上,DNS 协议规定了最大名称长度,并且 CAA 处理不会在现有需要缓解 DoS 攻击的基础上在某种程度上加剧此问题。

5.6. 滥用关键标志位

CA 可能会利用关键标志位诱使客户发布阻止竞争 CA 颁发证书的记录,即使客户打算授权多个提供商。如果客户基于 CA 提供的数据设置 CAA 记录,而不是自己生成这些记录,就可能发生这种情况。

实际上,这种攻击效果有限,因为任何有能力的竞争者如果发现自己由于不支持标记为关键的属性而无法颁发证书,就应该调查原因并向客户报告。客户将因此发现他们被欺骗了。

6. 部署考量

实施 CAA 的 CA 可能会发现他们在查找 CAA 记录时收到错误。以下是一些常见错误原因,以便 CA 可以向其订阅者提供修复根本问题的指导。

6.1. 被阻止的查询或响应

一些中间件------特别是防 DDoS 设备------可能被配置为丢弃未知类型的 DNS 数据包,或者当它们认为自己受到攻击时,可能开始丢弃此类数据包。这通常表现为 DNS 查询超时或本地递归解析器返回 SERVFAIL。

6.2. 被拒绝的查询和畸形响应

一些权威名称服务器在被查询它们不认识的 RR 类型时,会以 REJECTED 或 NOTIMP 响应。至少有一个权威解析器在被查询未知 RR 类型时会产生畸形响应(QR(查询/响应)位设置为"0")。根据 [RFC1034],对未知 RR 类型的正确响应 RCODE 是 0("无错误条件")。

6.3. 委托给私有名称服务器

一些 FQDN 管理员通过将子域委托给 IP 地址是私有的名称服务器,使得该子域的内容在公共互联网上无法解析。为这样的子域处理 CAA 记录的 CA 将从其递归解析器收到 SERVFAIL。CA可以将其解释为阻止颁发。希望为私有 FQDN 颁发证书的 FQDN 管理员应该使用带有公开可用名称服务器的分离视界 DNS,以便 CA 可以为这些 FQDN 接收到有效的、空的 CAA 响应。

6.4. 伪造的 DNSSEC 响应

对 CAA RR 的查询与大多数 DNS RR 类型不同,因为对 CAA RR 查询的有签名的空响应与伪造的响应有本质区别。有签名的空响应表示在给定标签处绝对没有设置 CAA 策略。伪造的响应可能意味着配置错误的区域或攻击者篡改了记录。DNSSEC 实现可能存在关于空响应签名的错误而不被注意,因为对于更常见的 RR 类型(如 A 和 AAAA),对于最终用户来说,空和伪造之间的区别无关紧要;它们都意味着网站不可用。

特别是,至少有两个实现实时签名的权威解析器在返回 DNSSEC 签名区域的空 RRset 时,与混合大小写查询结合存在错误。混合大小写查询,也称为 DNS 0x20,被一些递归解析器用来提高对 DNS 中毒攻击的抵抗力。期望 DNSSEC 签名的权威解析器将查询中的相同大写复制到其 ANSWER 部分,但同时签名响应时使用全小写。特别是,PowerDNS 4.0.4 之前的版本存在此错误。

相关推荐
三水不滴2 小时前
计算机网络核心网络模型
经验分享·笔记·tcp/ip·计算机网络·http·https
Trouvaille ~2 小时前
【Linux】UDP Socket编程实战(二):网络字典与回调设计
linux·运维·服务器·网络·c++·udp·操作系统
Kiyra2 小时前
从《守望先锋》2026前瞻,看大型分布式系统的“重构”与“并发挑战”
运维·服务器·重构
Bdygsl2 小时前
Linux(12)—— 文件与文件描述符
linux·运维·服务器
艾莉丝努力练剑2 小时前
【Linux:文件】基础IO:文件操作的系统调用和库函数各个接口汇总及代码演示
linux·运维·服务器·c++·人工智能·centos·io
使者大牙2 小时前
【单点知识】CANopen实用协议介绍
服务器·网络·tcp/ip
m0_694845573 小时前
music-website 是什么?前后端分离音乐网站部署实战
linux·运维·服务器·云计算·github
you-_ling3 小时前
Linux软件编程:Shell命令
java·linux·服务器
FairGuard手游加固3 小时前
面具外挂检测方案
linux·运维·服务器