2. DNSKEY 资源记录
DNSSEC 使用公钥密码学对 DNS 资源记录集 (RRset) 进行签名和认证. 公钥存储在 DNSKEY 资源记录中, 并用于 [RFC4035] 描述的 DNSSEC 认证过程: 区域使用私钥对其权威 RRset 进行签名, 并将对应的公钥存储在 DNSKEY RR 中. 解析器随后可以使用该公钥验证覆盖该区域内 RRset 的签名, 从而认证这些 RRset.
DNSKEY RR 并非用于存储任意公钥的记录, 禁止用于存储与 DNS 基础设施没有直接关系的证书或公钥.
DNSKEY RR 类型的 Type 值为 48.
DNSKEY RR 与类无关.
DNSKEY RR 没有特殊 TTL 要求.
2.1. DNSKEY RDATA 线格式 \
DNSKEY RR 的 RDATA 由 2 八位字节的 Flags 字段, 1 八位字节的 Protocol 字段, 1 八位字节的 Algorithm 字段和 Public Key 字段组成.
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags | Protocol | Algorithm |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ /
/ Public Key /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2.1.1. Flags 字段 \
Flags 字段的第 7 位是 Zone Key 标志. 如果第 7 位的值为 1, 则 DNSKEY 记录保存 DNS 区域密钥, 且 DNSKEY RR 的所有者名称必须是某个区域的名称. 如果第 7 位的值为 0, 则 DNSKEY 记录保存其他类型的 DNS 公钥, 禁止用于验证覆盖 RRset 的 RRSIG.
Flags 字段的第 15 位是 Secure Entry Point (SEP) 标志, 见 [RFC3757]. 如果第 15 位的值为 1, 则 DNSKEY 记录保存一个预期用作安全入口点的密钥. 该标志仅用于向区域签名软件或调试软件提示此 DNSKEY 记录的预期用途. 验证器禁止在签名验证过程中基于该位的设置以任何方式改变自身行为. 这也意味着, 设置了 SEP 位的 DNSKEY RR 还需要设置 Zone Key 标志, 才能合法地生成签名. 设置了 SEP 但未设置 Zone Key 标志的 DNSKEY RR 禁止用于验证覆盖 RRset 的 RRSIG.
第 0-6 位和第 8-14 位为保留位: 创建 DNSKEY RR 时这些位必须为 0, 接收时必须忽略这些位.
2.1.2. Protocol 字段 \
Protocol 字段的值必须为 3. 如果在签名验证期间发现其值不是 3, 则必须将该 DNSKEY RR 视为无效.
2.1.3. Algorithm 字段 \
Algorithm 字段标识公钥的密码算法, 并决定 Public Key 字段的格式. DNSSEC 算法类型列表见附录 A.1.
2.1.4. Public Key 字段 \
Public Key 字段保存公钥材料. 其格式取决于所存储密钥的算法, 并在单独的文档中说明.
2.1.5. DNSKEY RDATA 设计说明 \
虽然 Protocol 字段始终取值为 3, 但保留该字段是为了与早期版本的 KEY 记录保持向后兼容.
2.2. DNSKEY RR 表示格式 \
RDATA 部分的表示格式如下:
Flag 字段必须表示为无符号十进制整数. 按当前已定义的标志, 可能的值为: 0, 256 和 257.
Protocol 字段必须表示为值为 3 的无符号十进制整数.
Algorithm 字段必须表示为无符号十进制整数, 或表示为附录 A.1 中指定的算法助记符.
Public Key 字段必须表示为 Public Key 的 Base64 编码. Base64 文本中允许出现空白字符. Base64 编码的定义见 [RFC3548].
2.3. DNSKEY RR 示例 \
以下 DNSKEY RR 存储 example.com 的 DNS 区域密钥.
example.com. 86400 IN DNSKEY 256 3 5 ( AQPSKmynfzW4kyBv015MUG2DeIQ3
Cbl+BBZH4b/0PY1kxkmvHjcZc8no
kfzj31GajIQKY+5CptLr3buXA10h
WqTkF7H6RfoRqXQeogmMHfpftf6z
Mv1LyBUgia7za6ZEzOJBOztyvhjL
742iU/TpPSEDhm2SNKLijfUppn1U
aNvv4w== )
前四个文本字段指定所有者名称, TTL, 类和 RR 类型 (DNSKEY). 值 256 表示 Flags 字段中的 Zone Key 位 (第 7 位) 为 1. 值 3 是固定的 Protocol 值. 值 5 表示公钥算法. 附录 A.1 将算法类型 5 标识为 RSA/SHA1, 并指出 RSA/SHA1 公钥字段的格式在 [RFC3110] 中定义. 剩余文本是公钥的 Base64 编码.