什么是DNSSEC?签名验证与信任链完全解析

按顺序了解DNSSEC如何给DNS响应加上数字签名,以此验证响应是否被篡改。

普通DNS原本存在的问题

普通的DNS响应没有任何数字签名。这意味着一旦通信过程中遭遇缓存投毒或DNS欺骗攻击,伪造的响应被插入进来,设备本身没有办法辨别真伪,可能会把假响应当真,连接到伪造的服务器。

DNSSEC实际做的事情

DNSSEC(DNS安全扩展)给每个DNS响应附加一个数字签名,让接收方可以验证这个响应确实来自真正的域名所有者,并且在传输过程中没有被篡改。关键在于,这是一种完整性和来源验证技术,而不是加密技术——它并不会隐藏查询的具体内容。

核心记录:DNSKEY、RRSIG与DS

DNSKEY保存该区域的公钥,RRSIG保存针对某组记录的数字签名,DS(委托签名者)则注册在上级区域中,用来证明下级区域的密钥是真实可信的。

"不存在"也需要用签名来证明

"这条记录不存在"这样的响应同样可能被伪造,因此NSEC和NSEC3记录会以带签名的方式证明某条记录确实不存在,防止攻击者随意捏造一个不存在的子域名响应。

信任链:从根域名一路延伸到具体域名

根域名对顶级域名(TLD)的密钥进行签名,顶级域名再对其下各个域名的密钥进行签名,信任就这样一级一级传递下去。只要验证这条从根域名开始、环环相扣的签名链,就能确认其中任何一个环节都没有被篡改。

DNSSEC无法防范的问题

DNSSEC并不会对通信内容本身加密,如果想隐藏查询内容本身,还需要搭配DNS over HTTPS(DoH)或DNS over TLS(DoT)。另外,并非所有域名都启用了DNSSEC签名,未签名的域名依然无法获得这层保护。

如何检查自己的域名是否启用了DNSSEC

在Linux或Mac上,给dig命令加上+dnssec参数,就能看到响应中是否包含RRSIG记录。也可以使用多种在线DNSSEC分析工具,输入域名后直观查看整条签名链是否完整无误。

验证完整性,而非保护机密性

关于DNSSEC最常见的误解,就是把它当成一种加密技术。它证明的是响应真实且未被篡改,但完全没有隐藏"发生过这次查询"或"查询了什么内容"这一事实。机密性是另一个层面的问题,需要靠DoH或DoT来解决。

普及程度目前仍不均衡

由于DNSSEC需要域名所有者和注册局双方都正确配置才能生效,互联网上仍有相当一部分域名没有启用签名。域名未签名本身并不代表有问题,但这确实意味着该域名无法从这项机制中获得防范缓存投毒或欺骗的保护。

常见问题

使用DNSSEC之后,查询内容也会被加密吗?

不会。DNSSEC验证的是DNS响应是否真实、未被篡改,它不是一种加密技术,也不会隐藏查询的具体内容。如果需要隐藏查询内容,需要另外使用DoH或DoT。

是不是所有域名都受DNSSEC保护?

不是。DNSSEC需要域名所有者和注册商额外进行配置才会生效,属于可选功能而非普遍强制启用,因此仍有不少域名尚未完成签名。