2008-09-17 12 views
2

Je reçois les enregistrements DNS d'un programme Python, en utilisant DNS PythonPython + DNS: Impossible d'obtenir les enregistrements RRSIG: Pas de réponse

je peux obtenir divers dossiers liés à DNSSEC:

>>> import dns.resolver 
>>> myresolver = dns.resolver.Resolver() 
>>> myresolver.use_edns(1, 0, 1400) 
>>> print myresolver.query('sources.org', 'DNSKEY') 
<dns.resolver.Answer object at 0xb78ed78c> 
>>> print myresolver.query('ripe.net', 'NSEC') 
<dns.resolver.Answer object at 0x8271c0c> 

Mais aucun enregistrement RRSIG:

>>> print myresolver.query('sources.org', 'RRSIG') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 664, in query 
    answer = Answer(qname, rdtype, rdclass, response)       
    File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 121, in __init__ 
    raise NoAnswer                

J'ai essayé plusieurs domaines signés comme absolight.fr ou ripe.net.

En essayant avec dig, je vois qu'il y a en effet des enregistrements RRSIG.

Vérification avec tcpdump, je peux voir que DNS Python envoie la requête correcte et reçoit des réponses correctes (ici, huit dossiers):

16:09:39.342532 IP 192.134.4.69.53381 > 192.134.4.162.53: 22330+ [1au] RRSIG? sources.org. (40) 
16:09:39.343229 IP 192.134.4.162.53 > 192.134.4.69.53381: 22330 8/5/6 RRSIG[|domain] 

DNS Python 1.6.0 - Python 2.5.2 (R252 : 60911, 8 août 2008, 09:22:44) [GCC 4.3.1] sur linux2

Répondre

0

Si vous essayez ceci, que se passe-t-il?

print myresolver.query ('sources.org', 'tout', 'RRSIG')

3

Vous voulez dire probablement RRSIG TOUT (sinon, l'ordre est mal, la classe doit être après le type)

>>> print myresolver.query('sources.org', 'RRSIG', 'ANY') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 664, in query 
    answer = Answer(qname, rdtype, rdclass, response) 
    File "/usr/lib/python2.5/site-packages/dns/resolver.py", line 121, in __init__ 
    raise NoAnswer 
dns.resolver.NoAnswer 
0

Cela ressemble à un bogue probable dans la bibliothèque DNS Python, bien que je ne lise pas assez Python pour le trouver. Notez que dans tous les cas, votre paramètre de taille de tampon EDNS0 n'est pas assez grand pour gérer les enregistrements RRSIG pour sources.org, votre client et votre serveur devront basculer vers TCP/IP.

+0

Testé également avec une taille de tampon EDNS de 4096, même résultat. – bortzmeyer

0

Vous pouvez utiliser raise_on_no_answer=False et vous obtiendrez la réponse correcte:

resolver.query(hostname, dnsrecord, raise_on_no_answer=False) 
0

RRSIG n'est pas un enregistrement, il est un condensé d'un hachage enregistrement DNS valide. Vous pouvez interroger un enregistrement DNSKEY, définir want_dnssec = True et obtenir un enregistrement DNSKEY et un "RRSIG d'un enregistrement DNSKEY". Plus généralement, RRSIG est simplement une signature d'un enregistrement valide (tel qu'un enregistrement DS).

Ainsi, lorsque vous demandez au serveur

myresolver.query('sources.org', 'RRSIG') 

Il ne sait pas ce que vous demandez. RRSIG en lui-même n'a pas de sens, vous devez spécifier RRSIG de quoi?