长时间的听众,第一次来电。
我正在编写一个包含 DNSSEC 验证的 DNS 解析器,并且在多次通读受影响的 RFC 后注意到一些我无法真正理解的东西。
在解析uk.
(特别是co.uk.
(TLD中的域期间,我遇到了DNSSEC验证触发的无限循环。 为了简单起见,让我们假设该进程已经缓存了所有根区域,因此让我们从那里继续:
-
在其中一个注册的
uk.
名称服务器上执行co.uk. IN NS
查询; <<>> DiG 9.10.5 <<>> co.uk. NS @nsa.nic.uk +dnssec ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54513 ;; flags: qr aa rd; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 14 ;; WARNING: recursion requested but not available ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;co.uk. IN NS ;; ANSWER SECTION: co.uk. 172800 IN NS dns3.nic.uk. co.uk. 172800 IN NS dns2.nic.uk. co.uk. 172800 IN NS dns1.nic.uk. co.uk. 172800 IN NS nsb.nic.uk. co.uk. 172800 IN NS nsc.nic.uk. co.uk. 172800 IN NS nsa.nic.uk. co.uk. 172800 IN NS nsd.nic.uk. co.uk. 172800 IN NS dns4.nic.uk. co.uk. 172800 IN RRSIG NS 8 2 172800 20180622150723 20180518150505 33621 co.uk. pYoHwxWpkPP6FfIUk14o5qsO0cxA3CaPvfKGT++MuBhW9Ls/7Xnl6WwE pyU3BIDylkVyELe6be6hCwVOfV3VWcT1JW86RJexhRtU74ZHWdVNnjYd +oQVOQ0V/rhDorVSKdA0G+uDyq11T6Z1ecCERlks63GF21aPM9bWEJD6 cOo= ;; ADDITIONAL SECTION: nsa.nic.uk. 172800 IN A 156.154.100.3 nsb.nic.uk. 172800 IN A 156.154.101.3 nsc.nic.uk. 172800 IN A 156.154.102.3 nsd.nic.uk. 172800 IN A 156.154.103.3 dns1.nic.uk. 172800 IN A 213.248.216.1 dns2.nic.uk. 172800 IN A 103.49.80.1 dns3.nic.uk. 172800 IN A 213.248.220.1 dns4.nic.uk. 172800 IN A 43.230.48.1 nsa.nic.uk. 172800 IN AAAA 2001:502:ad09::3 dns1.nic.uk. 172800 IN AAAA 2a01:618:400::1 dns2.nic.uk. 172800 IN AAAA 2401:fd80:400::1 dns3.nic.uk. 172800 IN AAAA 2a01:618:404::1 dns4.nic.uk. 172800 IN AAAA 2401:fd80:404::1
- 在任何事情之前(比如处理响应元素有效(,应该进行DNSSEC验证;因此,我们自然而然地对用于签署RRSIG的DNSKEY执行查询(我们注意到
co.uk.
是记录的签名者( - 为了获取区域
co.uk.
的 DNSKEY,我们需要知道该区域上的 NS 权威(提醒,我们已经拥有该信息,但尚未设法验证它(,因此我们启动对父区域 (uk.
( 名称服务器的co.uk. IN NS
查询,我们又回到了起点。
我确信这是一个设计缺陷,但无法真正理解是什么。从逻辑上讲(这里触发循环的关键步骤是(,在验证之前不应该考虑使用 RR,并且子区域委派记录,同样,从逻辑上讲,不应该使用子区域的 DNSKEY 进行签名,我认为即使父区域也是子区域的权威。
请提前帮助和感谢
正如您所注意到的,相同名称的服务器对于 .UK 和 CO.UK 都是权威的,因此您没有从父区域获得正常的引用响应,父区域在权威部分有 DS 和 NS 记录,而是来自子区域的权威响应,NS 记录在答案部分。
因此,正如您意识到的那样,您确实需要对 .UK 名称服务器进行额外的 DS 查询,但请注意,您不需要该 DS 记录来验证 NS 记录的 DNSKEY 和 RRSIG 记录。在正常委派响应中返回的(非顶点(NS 记录未签名,并且不需要验证。当您返回子区域响应时,NS 记录是顶点记录,并且(如果区域是 DNSSEC 签名的(NS 记录集将有一个 RRSIG,但在将这些 NS 记录用作区域的名称服务器之前,不需要验证这些 NS 记录。验证递归名称服务器仅在处理来自客户端的显式 NS 查询时需要验证 NS 记录。
最终,DNSSEC 依赖于验证区域中的数据,而不是提供它们的名称服务器的名称或地址。这与许多其他安全协议(如HTTPS(完全不同,HTTPS仅对服务器(可能还有客户端(端点进行身份验证。