Episode 3

密钥签名密钥是谁?

密钥签名密钥(key-signing key)闪亮登场,专门保证 DNSKEY 值得信任。

**密钥签名密钥(key-signing key)**闪亮登场,专门保证 DNSKEY 值得信任。

它验证 DNSKEY 记录的套路,跟区签名密钥保护 RRset 一模一样。

它验证 DNSKEY 记录的套路,跟区签名密钥保护 RRset 一模一样。

先来盘点一下家底:

先来盘点一下家底:

记录捆成 RRset,由区签名密钥签名;这把密钥的公钥,存在 DNSKEY 记录里。

记录捆成 RRset,由区签名密钥签名;这把密钥的公钥,存在 DNSKEY 记录里。

现在,这条 DNSKEY 记录再由密钥签名密钥签名,额外产出一条 RRSIG 记录。

现在,这条 DNSKEY 记录再由密钥签名密钥签名,额外产出一条 RRSIG 记录。

密钥签名密钥的公钥,则存在另一条 DNSKEY 记录里。

密钥签名密钥的公钥,则存在另一条 DNSKEY 记录里。

两条 DNSKEY 记录捆成一个 RRset,由密钥签名密钥的私钥签名。

两条 DNSKEY 记录捆成一个 RRset,由密钥签名密钥的私钥签名。

于是乎,解析器来要 DNSKEY 时,会收到一个装着 DNSKEY 记录的 RRset,外加一条 RRSIG。

于是乎,解析器来要 DNSKEY 时,会收到一个装着 DNSKEY 记录的 RRset,外加一条 RRSIG。

流程升级成这样……

流程升级成这样……

解析器向权威域名服务器请求 www.dnsimple.com 的 A 记录。

麻烦给我 www.dnsimple.com 的 A 记录?

流程升级成这样……

权威服务器返回装着 A 记录的 RRset,外加区签名密钥签名的 RRSIG。

权威服务器返回装着 A 记录的 RRset,外加区签名密钥签名的 RRSIG。

解析器回头再向权威服务器索要 DNSKEY,好验证 RRSIG 里的签名。

DNSKEY,麻烦也来一份?

权威服务器返回装着 A 记录的 RRset,外加区签名密钥签名的 RRSIG。

权威服务器返回一个 RRset,里面装着区签名密钥和密钥签名密钥两把公钥的 DNSKEY,外加一条 RRSIG。

权威服务器返回一个 RRset,里面装着区签名密钥和密钥签名密钥两把公钥的 DNSKEY,外加一条 RRSIG。

至此,解析器集齐了验证这次 DNS 查询的全部拼图。

至此,解析器集齐了验证这次 DNS 查询的全部拼图。

它先用区签名密钥的 DNSKEY,验证 RRset 里 A 记录的 RRSIG。

它先用区签名密钥的 DNSKEY,验证 RRset 里 A 记录的 RRSIG。

验证通过?那就再用密钥签名密钥的 DNSKEY,验证 DNSKEY RRset 的 RRSIG。

验证通过?那就再用密钥签名密钥的 DNSKEY,验证 DNSKEY RRset 的 RRSIG。

全套流程走完,解析器就可以放心大胆地信任权威服务器返回的这些 A 记录了。

全套流程走完,解析器就可以放心大胆地信任权威服务器返回的这些 A 记录了。

听上去很美好对吧?但新的问题又冒出来了。

听上去很美好对吧?但新的问题又冒出来了。
DNS 是层级结构的。信任一个区,可不代表能顺便信任它的父区(爹)和子区(娃)。
DNS 是层级结构的。信任一个区,可不代表能顺便信任它的父区(爹)和子区(娃)。

我们确认了 www.dnsimple.com 的 A 记录可信,那它的父级和子级怎么办?

我们确认了 www.dnsimple.com 的 A 记录可信,那它的父级和子级怎么办?

密钥签名密钥是自己给自己签名的。万一它自己反水了呢?

密钥签名密钥是自己给自己签名的。万一它自己反水了呢?
继续阅读 →