python - 以编程方式检查域是否受 DNSSEC 保护

标签 python dns dnssec

正如标题所说,我想以编程方式检查域的 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

关于python - 以编程方式检查域是否受 DNSSEC 保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137036/

相关文章:

windows - AI_FQDN 和 AI_CANONNAME 结果在 ADDRINFOW 结构中有什么区别?

dns - dig NS 和 nslookup 提供过时的名称服务器; +trace 或 whois 正确

python - 用 Pandas 计算滚动平均数

python - 如何使用 libchamplain 在 Python 中加载本地瓦片或 OSM XML?

python - 将字符串中的字符随机替换为当前字符以外的字符

apache - 设置Apache Web服务器

linux - 与 DPDK 集成是否有利于 DNS/DHCP/DNSSEC 服务器的性能?

linux - 有关 DS 记录更新的 DNSSEC key 翻转

python - 脚本没有阻塞