长时间的听众,第一次来电。
我正在编写一个包含 DNSSEC 验证的 DNS 解析器,并且在对受影响的 RFC 进行了几次通读后,我注意到了一些我无法真正理解的东西。
在解析uk.
(特别是co.uk.
)TLD 中的域期间,我遇到了 DNSSEC 验证触发的无限循环。为了简单起见,我们假设该进程已经缓存了所有根区域,所以让我们从那里开始:
co.uk. IN NS
在其中一个注册的uk.
名称服务器上执行查询; <<>> 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.
是记录的签名者) - 为了获得区域的 DNSKEY,
co.uk.
我们需要知道该区域的 NS 权威(提醒,我们已经拥有该信息,但尚未设法验证它),因此我们co.uk. IN NS
向父区域 (uk.
)发起查询名称服务器,我们又回到了起点。
我确定这是一个设计缺陷,但无法真正理解是什么。从逻辑上讲(这里触发循环的关键步骤是)在验证之前不应该考虑使用 RR,并且从逻辑上讲,子区域委派记录也不应该使用子区域的 DNSKEY 进行签名,我认为甚至如果父区域也对子区域具有权威性。
请帮助并提前感谢您