正如标题所说,我想以编程方式检查域的 DNS 响应是否受 DNSSEC 保护。
我怎么能这样做?
如果有一个pythonic解决方案,那就太好了。
更新:将请求更改为响应,抱歉造成混淆
使用 DNS 解析器(例如dnspython
),您可以查询域的 DNSKEY RRset 并打开DO
(dnssec OK) 查询标志。如果查询成功,则答案将设置AD
(经过身份验证的数据)标志,并将包含区域的 RRSIG 签名(如果已签名)。
更新:使用的基本示例dnspython
import dns.name
import dns.query
import dns.dnssec
import dns.message
import dns.resolver
import dns.rdatatype
# get nameservers for target domain
response = dns.resolver.query('example.com.',dns.rdatatype.NS)
# we'll use the first nameserver in this example
nsname = response.rrset[0].to_text() # name
response = dns.resolver.query(nsname,dns.rdatatype.A)
nsaddr = response.rrset[0].to_text() # IPv4
# get DNSKEY for zone
request = dns.message.make_query('example.com.',
dns.rdatatype.DNSKEY,
want_dnssec=True)
# send the query
response = dns.query.udp(request,nsaddr)
if response.rcode() != 0:
# HANDLE QUERY FAILED (SERVER ERROR OR NO DNSKEY RECORD)
# answer should contain two RRSET: DNSKEY and RRSIG(DNSKEY)
answer = response.answer
if len(answer) != 2:
# SOMETHING WENT WRONG
# the DNSKEY should be self signed, validate it
name = dns.name.from_text('example.com.')
try:
dns.dnssec.validate(answer[0],answer[1],{name:answer[0]})
except dns.dnssec.ValidationFailure:
# BE SUSPICIOUS
else:
# WE'RE GOOD, THERE'S A VALID DNSSEC SELF-SIGNED KEY FOR example.com
要查看特定请求是否受到保护,请查看请求数据包中的 DO 标志。无论您使用什么语言和库来连接 DNS,都应该有一个访问器(它可能被称为其他名称,例如“dnssec”)。
如果您想知道某个区域是否受保护,第一个答案是正确的但不完整。所描述的过程将告诉您该区域自己的数据是否已签名。为了检查对区域的委托是否受到保护,您需要向父区域的名称服务器询问您感兴趣的区域的(正确签名的)DS 记录。