3. RRSIG资源记录 (The RRSIG Resource Record)
DNSSEC使用公钥密码学来签名和认证DNS资源记录集 (RRsets)。数字签名存储在RRSIG资源记录中,并用于[RFC4035]中描述的DNSSEC认证过程。验证器可以使用这些RRSIG RR来认证来自区域的RRset。RRSIG RR 必须 (MUST) 仅用于携带用于保护DNS操作的验证材料 (数字签名)。
RRSIG记录包含具有特定名称、类和类型的RRset的签名。RRSIG RR指定签名的有效期,并使用Algorithm、签名者名称和Key Tag来标识包含验证器可用于验证签名的公钥的DNSKEY RR。
因为区域中的每个权威RRset都必须受到数字签名的保护,所以对于包含CNAME RR的名称,必须 (MUST) 存在RRSIG RR。这是对传统DNS规范[RFC1034]的更改,该规范声明如果名称存在CNAME,则它是该名称允许的唯一类型。在已签名区域中,RRSIG和NSEC (见第4节) 必须 (MUST) 与CNAME资源记录存在于相同的名称。
RRSIG RR类型的Type值为 46。
RRSIG RR与类无关。
RRSIG RR 必须 (MUST) 与其覆盖的RRset具有相同的类。
RRSIG RR的TTL值必须 (MUST) 匹配其覆盖的RRset的TTL值。这是对[RFC2181]关于RRset内单个RR的TTL值规则的例外: 如果具有相同所有者名称的单个RRSIG RR覆盖的RRset具有不同的TTL值,则它们将具有不同的TTL值。
3.1. RRSIG RDATA线格式 (RRSIG RDATA Wire Format)
RRSIG RR的RDATA由一个2字节的Type Covered字段、一个1字节的Algorithm字段、一个1字节的Labels字段、一个4字节的Original TTL字段、一个4字节的Signature Expiration字段、一个4字节的Signature Inception字段、一个2字节的Key Tag、签名者名称字段和签名字段组成。
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字段 (The Type Covered Field)
Type Covered字段标识此RRSIG记录覆盖的RRset的类型。
3.1.2. Algorithm Number字段 (The Algorithm Number Field)
Algorithm Number字段标识用于创建签名的密码算法。DNSSEC算法类型列表可以在附录A.1中找到。
3.1.3. Labels字段 (The Labels Field)
Labels字段指定原始RRSIG RR所有者名称中的标签数量。此字段的意义在于验证器使用它来确定答案是否从通配符合成。如果是,它可以用于确定生成签名时使用的所有者名称。
要验证签名,验证器需要用于创建签名的原始所有者名称。如果原始所有者名称包含通配符标签 ("*"),则在响应过程中服务器可能已扩展所有者名称,在这种情况下,验证器将必须重建原始所有者名称以验证签名。[RFC4035]描述了如何使用Labels字段重建原始所有者名称。
Labels字段的值禁止 (MUST NOT) 计算终止所有者名称的null (根) 标签或通配符标签 (如果存在)。Labels字段的值必须 (MUST) 小于或等于RRSIG所有者名称中的标签数量。例如,"www.example.com."的Labels字段值为3,"*.example.com."的Labels字段值为2。根 (".") 的Labels字段值为0。
虽然通配符标签不包含在RRSIG RR的Labels字段中存储的计数中,但在生成或验证签名时,通配符标签是RRset所有者名称的一部分。
3.1.4. Original TTL字段 (Original TTL Field)
Original TTL字段指定权威区域中出现的覆盖RRset的TTL。
Original TTL字段是必需的,因为缓存解析器递减缓存RRset的TTL值。为了验证签名,验证器需要原始TTL。[RFC4035]描述了如何使用Original TTL字段值重建原始TTL。
3.1.5. 签名过期和生效时间字段 (Signature Expiration and Inception Fields)
签名过期 (Signature Expiration) 和生效时间 (Inception) 字段指定签名的有效期。RRSIG记录禁止 (MUST NOT) 在生效日期之前用于认证,并且禁止 (MUST NOT) 在过期日期之后用于认证。
签名过期和生效时间字段值以32位无符号数字形式指定日期和时间,表示自1970年1月1日00:00:00 UTC以来经过的秒数,忽略闰秒,以网络字节顺序。此格式可以表示的最长间隔而不回绕大约为136年。如果过期字段值接近32位回绕点或签名是长期有效的,则RRSIG RR的过期字段值可以在数值上小于生效时间字段值。因此,涉及这些字段的所有比较必须 (MUST) 使用[RFC1982]中定义的"序列号算术"。作为直接结果,这些字段中包含的值不能引用过去或未来超过68年的日期。
3.1.6. Key Tag字段 (The Key Tag Field)
Key Tag字段包含验证此签名的DNSKEY RR的key tag值,以网络字节顺序。附录B解释了如何计算Key Tag值。
3.1.7. 签名者名称字段 (The Signer's Name Field)
签名者名称 (Signer's Name) 字段值标识验证器应该用于验证此签名的DNSKEY RR的所有者名称。签名者名称字段必须 (MUST) 包含覆盖RRset的区域的名称。发送方在传输RRSIG RR时禁止 (MUST NOT) 在签名者名称字段上使用DNS名称压缩。
3.1.8. 签名字段 (The Signature Field)
签名字段包含覆盖RRSIG RDATA (不包括签名字段) 和由RRSIG所有者名称、RRSIG类和RRSIG Type Covered字段指定的RRset的密码签名。此字段的格式取决于使用的算法,这些格式在单独的配套文档中描述。
3.1.8.1. 签名计算 (Signature Calculation)
签名覆盖RRSIG RDATA (不包括签名字段) 并覆盖由RRSIG所有者名称、RRSIG类和RRSIG Type Covered字段指定的数据RRset。RRset采用规范形式 (见第6节),并且RR(1),...RR(n)集按如下方式签名:
signature = sign(RRSIG_RDATA | RR(1) | RR(2)... ) 其中
"|" 表示连接;
RRSIG_RDATA 是RRSIG RDATA字段的线格式,
签名者名称字段采用规范形式,
并排除签名字段;
RR(i) = owner | type | class | TTL | RDATA length | RDATA
"owner" 是规范形式的RRset的完全限定所有者名称
(对于具有通配符所有者名称的RR,
所有者名称中包含通配符标签);
每个RR必须具有与RRSIG RR相同的所有者名称;
每个RR必须具有与RRSIG RR相同的类;
RRset中的每个RR必须具有RRSIG RR的Type Covered字段中列出的RR类型;
RRset中的每个RR必须具有RRSIG Original TTL字段中列出的TTL;
每个RR的RDATA字段中的任何DNS名称必须采用规范形式;并且
RRset必须按规范顺序排序。
有关RRset的规范形式和排序的详细信息,请参见第6.2节和第6.3节。
3.2. RRSIG RR展示格式 (The RRSIG RR Presentation Format)
RDATA部分的展示格式如下:
Type Covered字段表示为RR类型助记符。当助记符未知时,必须 (MUST) 使用[RFC3597]第5节中描述的TYPE表示。
Algorithm字段值必须 (MUST) 表示为无符号十进制整数或附录A.1中指定的算法助记符。
Labels字段值必须 (MUST) 表示为无符号十进制整数。
Original TTL字段值必须 (MUST) 表示为无符号十进制整数。
签名过期时间和生效时间字段值必须 (MUST) 表示为无符号十进制整数 (表示自1970年1月1日00:00:00 UTC以来的秒数),或以UTC的YYYYMMDDHHmmSS形式,其中:
- YYYY是年份 (0001-9999,但请参见第3.1.5节);
- MM是月份编号 (01-12);
- DD是月份中的日期 (01-31);
- HH是小时,采用24小时表示法 (00-23);
- mm是分钟 (00-59);并且
- SS是秒 (00-59)。
请注意,始终可以区分这两种格式,因为YYYYMMDDHHmmSS格式将始终恰好是14位数字,而32位无符号整数的十进制表示永远不会超过10位数字。
Key Tag字段必须 (MUST) 表示为无符号十进制整数。
签名者名称字段值必须 (MUST) 表示为域名。
签名字段表示为签名的Base64编码。Base64文本中允许空白。请参见第2.2节。
3.3. RRSIG RR示例 (RRSIG RR Example)
以下RRSIG RR存储host.example.com的A RRset的签名:
host.example.com. 86400 IN RRSIG A 5 3 86400 20030322173103 (
20030220173103 2642 example.com.
oJB1W6WNGv+ldvQ3WDG0MQkg5IEhjRip8WTr
PYGv07h108dUKGMeDPKijVCHX3DDKdfb+v6o
B9wfuh3DTJXUAfI/M0zmO/zz8bW0Rznl8O3t
GNazPwQKkRN20XPXV6nwwfoXmJQbsLNrLfkG
J5D6fwFm8nN+6pBzeDQfsS3Ap3o= )
前四个字段指定所有者名称、TTL、类和RR类型 (RRSIG)。"A"表示Type Covered字段。值5标识用于创建签名的算法 (RSA/SHA1)。值3是原始所有者名称中的标签数量。RRSIG RDATA中的值86400是覆盖的A RRset的Original TTL。20030322173103和20030220173103分别是过期日期和生效日期。2642是Key Tag,example.com.是签名者名称。剩余文本是签名的Base64编码。
请注意,RRSIG RR所有者名称、类和Type Covered的组合表明此RRSIG覆盖"host.example.com"的A RRset。Label值为3表示未使用通配符扩展。Algorithm、签名者名称和Key Tag表明此签名可以使用算法为5且key tag为2642的example.com区域DNSKEY RR进行认证。
相关章节导航:
- 上一章: 2. DNSKEY资源记录
- 下一章: 4. NSEC资源记录