记录一下自己在使用dnspython来update TLSA时遇到的问题
1。在填充好TLSA对象,update对象后,打印update对象,发现报文正确,但是使用tcp发送后查询新添加的记录发现字节错位了,如
待添加记录为:_443._tcp.www.test.com IN TLSA 1 2 3 XXXX
添加成功后查询该记录得到
_443._tcp.www.test.com IN TLSA 0 1 0 0203XXXX
很奇怪的是发生了字节错位,一开始是怀疑不会是bind9不遵守RFC吧?后来想想可能性几乎为0。。。。
然后又试图通过截取报文,验证是否是自己发送的报文存在问题,最后发现问题出现在dns.query.tcp()处
使用pdb调试后未发现问题,只知道最后是由于to_wire()函数导致,从Update.to_wire()到Message.to_wire(),然后又追踪到到Render.get_wire()(发现这个函数是打印报文头的) 最后不知道怎么调用了TLSA.to_wire函数
好吧……嗯。。。。反正最后问题是通过我更新dnspython的编译莫名其妙的解决了,似乎是没什么借鉴意义……
2 。 有关delete时候的rdataclass问题
在TLSA delete 时,打印update对象发现构造update时指定的dns.rdataclass.IN 变成了NONE 虽然未影响最后update结果,但是还是不太明白为什么要这么做。
我传入delete函数的参数是 TLSA对象,
149 args = list(args)
150 if isinstance(args[0], dns.rdata.Rdata):#返回值True,进入该分支
151 for rd in args:
152 self._add_rr(name, 0, rd, dns.rdataclass.NONE)#设置rdataclass 为NONE,
153 else:#如果是依次传入的args
154 rdtype = args.pop(0) #pop出RR TYPE
155 if isinstance(rdtype, (str, unicode)):
156 rdtype = dns.rdatatype.from_text(rdtype)#如果是type字符串表示,则转化成相应Type的对象
157 if len(args) == 0:
158 rrset = self.find_rrset(self.authority, name,
159 self.zone_rdclass, rdtype,
160 dns.rdatatype.NONE,
161 dns.rdataclass.ANY,
162 True, True)
163 else:
164 for s in args:
165 rd = dns.rdata.from_text(self.zone_rdclass, rdtype, s,
166 self.origin)#生成TLSA 对象
167 self._add_rr(name, 0, rd, dns.rdataclass.NONE)#还是设置成NONE?
为啥呢?难道删除的时候不用匹配rdataclass吗?