附录 C. 认证示例 (Authentication Examples)
本节示例展示如何认证附录 B 中的响应消息.
C.1. 认证答案 (Authenticating an Answer)
附录 B.1 中的查询返回了 x.w.example.com 的 MX RRset. 对应的 RRSIG 表明该 MX RRset 由使用算法 5, key tag 为 38519 的 "example" DNSKEY 签名. 解析器需要对应的 DNSKEY RR 来认证此答案. 下面的讨论描述解析器可以如何获得此 DNSKEY RR.
RRSIG 表明 MX RRset 的原始 TTL 为 3600, 因此出于认证目的, 当前 TTL 被替换为 3600. RRSIG labels 字段值为 3, 表明该答案不是通配符扩展的结果. x.w.example.com MX RRset 被置于规范形式, 并且假定当前时间落在签名开始和过期日期之间, 该签名即被认证.
C.1.1. 认证 Example DNSKEY RR (Authenticating the Example DNSKEY RR)
此示例展示从已配置的根 DNSKEY (或 DS RR) 开始, 沿树向下移动以认证目标 "example" DNSKEY RR 的逻辑认证过程. 注意, 这里为了清晰起见展示的是逻辑顺序. 实现可以选择在收到委派响应时构造认证, 也可以选择在获得所有 RRset 后才构造认证链, 或采用其认为合适的任何组合. 这里的示例只演示逻辑过程, 不规定任何实现规则.
假定解析器从为根区域配置的 DNSKEY RR (或为根区域配置的 DS RR) 开始. 解析器检查该已配置 DNSKEY RR 是否存在于根 DNSKEY RRset 中 (或该 DS RR 是否匹配根 DNSKEY RRset 中的某个 DNSKEY), 该 DNSKEY RR 是否已签名根 DNSKEY RRset, 以及签名生命周期是否有效. 如果所有这些条件都满足, DNSKEY RRset 中的所有密钥都被视为已认证. 然后解析器使用一个或多个根 DNSKEY RR 来认证 "example" DS RRset. 注意, 解析器可能必须查询根区域以获得根 DNSKEY RRset 或 "example" DS RRset.
一旦使用根 DNSKEY 认证了 DS RRset, 解析器就检查 "example" DNSKEY RRset 中是否存在匹配某条已认证 "example" DS RR 的 "example" DNSKEY RR. 如果找到这样的匹配 "example" DNSKEY, 解析器检查该 DNSKEY RR 是否已签名 "example" DNSKEY RRset, 且签名生命周期是否有效. 如果这些条件满足, "example" DNSKEY RRset 中的所有密钥都被视为已认证.
最后, 解析器检查 "example" DNSKEY RRset 中是否有某条 DNSKEY RR 使用算法 5 且 key tag 为 38519. 此 DNSKEY 用于认证响应中包含的 RRSIG. 如果多条 "example" DNSKEY RR 匹配此算法和 key tag, 则逐一尝试每条 DNSKEY RR; 只要任一匹配 DNSKEY RR 按上述方式验证签名, 该答案即被认证.
C.2. 名称错误 (Name Error)
附录 B.2 中的查询返回了 NSEC RR, 证明请求的数据不存在且没有适用的通配符. 通过验证两条 NSEC RR 来认证否定应答. NSEC RR 的认证方式与上文讨论的 MX RRset 完全相同.
C.3. No Data 错误 (No Data Error)
附录 B.3 中的查询返回了一条 NSEC RR, 证明请求的名称存在, 但请求的 RR 类型不存在. 通过验证该 NSEC RR 来认证否定应答. NSEC RR 的认证方式与上文讨论的 MX RRset 完全相同.
C.4. 指向已签名区域的委派响应 (Referral to Signed Zone)
附录 B.4 中的查询返回了指向已签名 "a.example." 区域的委派响应. DS RR 的认证方式与上文讨论的 MX RRset 完全相同. 此 DS RR 用于认证 "a.example" DNSKEY RRset.
一旦使用 "example" DNSKEY 认证了 "a.example" DS RRset, 解析器就检查 "a.example" DNSKEY RRset 中是否存在匹配该 DS RR 的 "a.example" DNSKEY RR. 如果找到这样的匹配 "a.example" DNSKEY, 解析器检查该 DNSKEY RR 是否已签名 "a.example" DNSKEY RRset, 且签名生命周期是否有效. 如果这些条件满足, "a.example" DNSKEY RRset 中的所有密钥都被视为已认证.
C.5. 指向未签名区域的委派响应 (Referral to Unsigned Zone)
附录 B.5 中的查询返回了指向未签名 "b.example." 区域的委派响应. NSEC RR 证明没有 DS RR 与 "b.example." 委派关联. NSEC RR 的认证方式与上文讨论的 MX RRset 完全相同.
解析器确定 "b.example." 是未签名区域, 且来自 "b.example." 的答案将是不安全的.
C.6. 通配符扩展 (Wildcard Expansion)
附录 B.6 中的查询产生了通配符扩展. 检查 RRSIG labels 字段可知, 该答案是通配符扩展的结果. "*.w.example." 通配符名称被置于规范形式, 并按 附录 C.1 的方式认证. 解析器还必须验证 NSEC RR, 以证明区域中不存在本会替代通配符匹配使用的更接近匹配.
C.7. 通配符 No Data 错误 (Wildcard No Data Error)
附录 B.7 中的查询使用通配符作答, 但响应是 "no data" 响应. RRSIG 中 labels 字段值为 2, 表明该 NSEC RR 派生自通配符并提供通配符名称. "*.w.example." 通配符 NSEC RR 按 附录 C.1 的方式认证. 解析器还必须验证 NSEC RR, 以证明区域中不存在本会替代通配符匹配使用的更接近匹配.
C.8. DS 子区域 No Data 错误 (DS Child Zone No Data Error)
附录 B.8 中的查询被发送到子区域, 并返回了一条 NSEC RR, 表明子区域中不存在 DS RR. 注意, NSEC RR 指示子区域顶点处存在 SOA RR, 这使解析器能够确定此答案来自子区域而非父区域. NSEC RR 的认证方式与上文讨论的 MX RRset 完全相同.