Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Python, TLS et les délais de garde

Première rédaction de cet article le 6 avril 2009


J'ai besoin de munir un client HTTP existant, écrit en Python, de TLS. Je ne veux pas seulement faire des connexions chiffrées mais aussi accéder à des informations sur le certificat du serveur, notamment le nom de la CA qui l'a signé. Comme le but du projet est d'interroger pas mal de serveurs HTTP, souvent non répondants (il est fréquent qu'un serveur réponde en HTTP et timeoute en HTTPS et on ne peut pas le savoir avant d'essayer), il faut pouvoir mettre des délais de garde sur la connexion.

Il y a plusieurs solutions en Python (en dépit de la règle There should be one-- and preferably only one --obvious way to do it. du PEP 20) mais aucune parfaite pour ce besoin. Voyons les solutions.

python-gnutls : pratiquement pas documenté, peut-être pas maintenu, ne permet pas de mettre un délai maximum (car il fonctionne avec des prises non-bloquantes, on récupère un gnutls.errors.OperationWouldBlock: Function was interrupted).

Python OpenSSL. Pas mieux : si on met un timeout, il plante également tout de suite avec un OpenSSL.SSL.WantReadError.

Le module SSL de la bibliothèque standard. Il nécessite Python 2.6 et je voudrais bien que mon code marche en 2.5. Il ne semble pas permettre de récupérer les métadonnées du certificat.

TLSlite. Ne semble pas capable de récupérer le nom du signataire.

Donc, toujours pas de solution pour faire du TLS avec timeout. Le programme qui l'appelera étant multi-threadé, je ne peux pas utiliser les signaux Unix. Je suis donc toujours à la recherche de la solution géniale. Pour les utilisateurs de Stack Overflow, j'ai lancé une récompense de 100 points sur cette question.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)