跳到主要内容

3. RRSIG 资源记录

DNSSEC 使用公钥密码学对 DNS 资源记录集 (RRset) 进行签名和认证. 数字签名存储在 RRSIG 资源记录中, 并用于 [RFC4035] 描述的 DNSSEC 认证过程. 验证器可以使用这些 RRSIG RR 认证来自该区域的 RRset. RRSIG RR 必须只用于承载保护 DNS 操作所需的验证材料 (数字签名).

RRSIG 记录包含具有特定名称, 类和类型的 RRset 的签名. RRSIG RR 为签名指定有效期, 并使用 Algorithm, Signer's Name 和 Key Tag 标识包含公钥的 DNSKEY RR, 验证器可使用该公钥验证签名.

由于区域中的每个权威 RRset 都必须受数字签名保护, 因此包含 CNAME RR 的名称也必须存在 RRSIG RR. 这是对传统 DNS 规范 [RFC1034] 的变更. 传统规范规定, 如果某个名称存在 CNAME, 则该名称只允许存在这一种类型. 在已签名区域中, RRSIG 和 NSEC (见第 4 节) 必须与 CNAME 资源记录使用相同名称存在.

RRSIG RR 类型的 Type 值为 46.

RRSIG RR 与类无关.

RRSIG RR 必须与其覆盖的 RRset 具有相同的类.

RRSIG RR 的 TTL 值必须与其覆盖的 RRset 的 TTL 值匹配. 这是 [RFC2181] 关于 RRset 内单个 RR 的 TTL 值规则的例外: 如果同一所有者名称下的各个 RRSIG RR 覆盖的 RRset 具有不同 TTL 值, 则这些 RRSIG RR 也会具有不同 TTL 值.

3.1. RRSIG RDATA 线格式 \

RRSIG RR 的 RDATA 由 2 八位字节的 Type Covered 字段, 1 八位字节的 Algorithm 字段, 1 八位字节的 Labels 字段, 4 八位字节的 Original TTL 字段, 4 八位字节的 Signature Expiration 字段, 4 八位字节的 Signature Inception 字段, 2 八位字节的 Key Tag, Signer's Name 字段和 Signature 字段组成.

                     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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type Covered | Algorithm | Labels |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Original TTL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Signature Expiration |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Signature Inception |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Key Tag | /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Signer's Name /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/ /
/ Signature /
/ /
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

3.1.1. Type Covered 字段 \

Type Covered 字段标识此 RRSIG 记录所覆盖的 RRset 类型.

3.1.2. Algorithm Number 字段 \

Algorithm Number 字段标识用于创建签名的密码算法. DNSSEC 算法类型列表见附录 A.1.

3.1.3. Labels 字段 \

Labels 字段指定原始 RRSIG RR 所有者名称中的标签数量. 该字段的意义在于, 验证器可用它判断应答是否由通配符合成. 如果是, 该字段可用于确定生成签名时使用的所有者名称.

为了验证签名, 验证器需要创建签名时使用的原始所有者名称. 如果原始所有者名称包含通配符标签 ("*"), 服务器可能在响应过程中扩展了该所有者名称. 在这种情况下, 验证器必须重构原始所有者名称才能验证签名. [RFC4035] 描述了如何使用 Labels 字段重构原始所有者名称.

Labels 字段的值禁止计入终止所有者名称的空 (根) 标签, 也禁止计入通配符标签 (如果存在). Labels 字段的值必须小于或等于 RRSIG 所有者名称中的标签数量. 例如, "www.example.com." 的 Labels 字段值为 3, "*.example.com." 的 Labels 字段值为 2. 根 (".") 的 Labels 字段值为 0.

虽然通配符标签不计入 RRSIG RR 的 Labels 字段中存储的计数, 但在生成或验证签名时, 通配符标签是 RRset 所有者名称的一部分.

3.1.4. Original TTL 字段 \

Original TTL 字段指定被覆盖 RRset 在权威区域中出现时的 TTL.

Original TTL 字段是必需的, 因为缓存解析器会递减已缓存 RRset 的 TTL 值. 为了验证签名, 验证器需要原始 TTL. [RFC4035] 描述了如何使用 Original TTL 字段值重构原始 TTL.

3.1.5. Signature Expiration 和 Signature Inception 字段 \

Signature Expiration 和 Signature Inception 字段为签名指定有效期. RRSIG 记录禁止在起始日期之前用于认证, 也禁止在过期日期之后用于认证.

Signature Expiration 和 Signature Inception 字段值以 32 位无符号秒数表示日期和时间, 该秒数从 1970 年 1 月 1 日 00:00:00 UTC 起算, 忽略闰秒, 并采用网络字节序. 这种格式在不回绕的情况下可表达的最长间隔约为 136 年. 如果过期字段值接近 32 位回绕点, 或者签名寿命很长, RRSIG RR 的 Expiration 字段值在数值上可能小于 Inception 字段值. 因此, 涉及这些字段的所有比较都必须使用 [RFC1982] 定义的 "序列号算术". 其直接结果是, 这些字段中包含的值不能指代过去或未来超过 68 年的日期.

3.1.6. Key Tag 字段 \

Key Tag 字段包含用于验证此签名的 DNSKEY RR 的密钥标签值, 采用网络字节序. 附录 B 说明了如何计算 Key Tag 值.

3.1.7. Signer's Name 字段 \

Signer's Name 字段值标识验证器应使用来验证此签名的 DNSKEY RR 的所有者名称. Signer's Name 字段必须包含被覆盖 RRset 所属区域的名称. 发送方在传输 RRSIG RR 时禁止对 Signer's Name 字段使用 DNS 名称压缩.

3.1.8. Signature 字段 \

Signature 字段包含密码学签名, 该签名覆盖 RRSIG RDATA (不包括 Signature 字段) 以及由 RRSIG 所有者名称, RRSIG 类和 RRSIG Type Covered 字段指定的 RRset. 该字段的格式取决于所使用的算法, 这些格式在单独的配套文档中说明.

3.2. RRSIG RR 表示格式 \

RDATA 部分的表示格式如下:

Type Covered 字段表示为 RR 类型助记符. 当助记符未知时, 必须使用 [RFC3597] 第 5 节描述的 TYPE 表示.

Algorithm 字段值必须表示为无符号十进制整数, 或表示为附录 A.1 中指定的算法助记符.

Labels 字段值必须表示为无符号十进制整数.

Original TTL 字段值必须表示为无符号十进制整数.

Signature Expiration 和 Signature Inception 字段值必须表示为无符号十进制整数, 表示自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的秒数, 或表示为 UTC 下的 YYYYMMDDHHmmSS 形式, 其中:

  • YYYY 是年份 (0001-9999)
  • MM 是月份编号 (01-12)
  • DD 是月份中的日期 (01-31)
  • HH 是小时, 使用 24 小时制表示 (00-23)
  • mm 是分钟 (00-59)
  • SS 是秒 (00-59)

向人类展示这些字段的实现应当使用 YYYYMMDDHHmmSS 格式.

Key Tag 字段必须表示为无符号十进制整数.

Signer's Name 字段值必须表示为域名.

Signature 字段必须表示为签名的 Base64 编码. Base64 文本中允许出现空白字符. Base64 编码的定义见 [RFC3548].

3.3. RRSIG RR 示例 \

以下 RRSIG RR 存储 host.example.com. 的 A RRset 的签名.

host.example.com. 86400 IN RRSIG A 5 3 86400 20050322173103 (
20050220173103 2642 example.com.
oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr
PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o
B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t
GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG
J5D6fwFm8nN+6pBzeDQfsS3Ap3o= )

前四个字段指定所有者名称, TTL, 类和 RR 类型 (RRSIG). "A" 表示 Type Covered 字段. 值 5 是 Algorithm 字段. 值 3 是 Labels 字段. 值 86400 是 Original TTL 字段, 即 A RRset 使用的 TTL 值. 时间值 20050322173103 和 20050220173103 分别是 Signature Expiration 和 Signature Inception 日期. 值 2642 是 Key Tag, example.com. 是 Signer's Name. 剩余文本是 Signature 字段的 Base64 编码.