目前正在研究dnssec的有关内容,需要对得到的rrsig记录进行验签。目前打算使用的解决方法是通过dnspython的dnssec.validate_rrsig()函数进行验证。
但相关的文档和代码实在太少了,自己多次尝试构建rrsig和rrset记录去验签都验证不通过。验签所用的dnskey和rrsig记录都来自于公网,理论上来说应该是能够验签的。
请问是否是我的传参有问题?亦或者是否有其他的python解决方案?
rrsig记录集:
paypal.com. 300 IN A 64.4.250.36
paypal.com. 300 IN A 64.4.250.37
paypal.com. 300 IN RRSIG A 5 2 300 20190208233736 20190109232130 11811 paypal.com. YsbDXEurHDP+LJOQ6i5PkspB1O7PjRE8bReV2QsP4r9Hhn41sjR9JkKM 4VqhmFFuN+mVefaoj5Els9rpGpYgSXXIP2bkseuITKCf9BXkITNuy1BY cgmRA67VVAnedkLGzGBBvUIchrwGF9NOt/jHMW9pbO9UqUiya/NDYDmY YIw=
dnskey:
paypal.com. 600 IN DNSKEY 256 3 5 AwEAAc/7r7w6qEg59vzyfcKgIm7K3h43tglKOJjoFyK5lxhl2e7vh8Cw vj3cwKQHccsvWuvAK0ummTSysxZT0JJgw8gkhIGGiZ63MJTcbocDezgZ iA/q4ejpjdrj27gs5mCHAsyC9BAVZiysfIwqtRFsP0GjivNYzIc6qGWA XcAJKLLX
报错内容:验证失败
raise ValidationFailure('verify failure')
dns.dnssec.ValidationFailure: verify failure
我尝试验签的代码如下:
import dns
import base64
from dns.rdatatype import (DNSKEY, RRSIG)
from dns.rdataclass import (IN)
import dns.name
import dns.rdtypes.ANY.DNSKEY
import dns.rdtypes.ANY.RRSIG
import dns.rrset
import dns.zone
signer = dns.name.from_text('paypal.com.')
signature = 'YsbDXEurHDP+LJOQ6i5PkspB1O7PjRE8bReV2QsP4r9Hhn41sjR9JkKM 4VqhmFFuN+mVefaoj5Els9rpGpYgSXXIP2bkseuITKCf9BXkITNuy1BY cgmRA67VVAnedkLGzGBBvUIchrwGF9NOt/jHMW9pbO9UqUiya/NDYDmY YIw='
rsignature = base64.b64decode(bytes(signature.encode('utf-8')))
rrsig = dns.rdtypes.ANY.RRSIG.RRSIG(IN, RRSIG, dns.rdatatype.A, 5, 2, 300, 1549640256, 1547047290, 11811, signer, rsignature)
rname = dns.name.from_text('paypal.com.')
rrset = dns.rrset.from_rdata(rname, 600, rrsig)
# rrset = name + ttl + rdata
r=dns.zone.Zone(dns.name.from_text('.'))
r['paypal.com.'] = dns.rdataset.from_text(IN, DNSKEY, 600, '256 3 5 AwEAAc/7r7w6qEg59vzyfcKgIm7K3h43tglKOJjoFyK5lxhl2e7vh8Cw vj3cwKQHccsvWuvAK0ummTSysxZT0JJgw8gkhIGGiZ63MJTcbocDezgZ iA/q4ejpjdrj27gs5mCHAsyC9BAVZiysfIwqtRFsP0GjivNYzIc6qGWA XcAJKLLX')
dns.dnssec.validate_rrsig(rrset, rrsig, r)