稚晖 2019-01-23 22:00 采纳率: 100%
浏览 645
已采纳

dnspython验签rrsig的正确方式?

目前正在研究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)
  • 写回答

2条回答

  • 稚晖 2019-01-26 21:47
    关注

    在stack overflow上提交的相同提问得到了回答:
    https://stackoverflow.com/questions/54331545/how-can-i-verify-rrsig-signature-using-dnspython
    总的来说就是rrsig验签原理并不是我之前设想的那样,还是原理没有查清楚。
    机翻一下:

    “需要验证rrsig记录的签名。” 请记住要完全执行此操作,除了验证特定的RRSIG记录确实是由给定的DNSKEY签名之外,您还需要在该DNSKEY记录上找到签名,检查它们,然后在父区域中找到相应的DS记录,检查其签名,依此类推,直到达到IANA root为止。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问