web-dev-qa-db-fra.com

Envoi de la requête TLS 1.2 en Python 2.6

Je suis bloqué avec Python 2.6 et je dois envoyer une demande de publication avec TLS 1.2. La bibliothèque requests de Python 2.6 prend-elle en charge TLS 1.2? Comment puis-je m'assurer/vérifier que la demande est faite via TLS1.2 et non une autre version?

Un exemple de demande est

r=requests.post(url,data=payload,verify=False)

Quelque part sur le forum, j’ai appris qu’il nous fallait compiler pyOpenSSL pour supporter cela. Y a-t-il un moyen plus facile?

13
MultipleCrashes

Le module ssl de Python 2.6 ne prend en charge que TLS 1.0. Si vous ne souhaitez pas introduire de dépendances supplémentaires (comme pyOpenSSL, comme vous le suggérez), vous devrez effectuer une mise à niveau vers Python 2.7 ou 3.x pour pouvoir utiliser les nouvelles versions de TLS.

Pour forcer une version particulière de TLS dans Python 2.7.9 ou version ultérieure, construit une SSLContext avec le PROTOCOL_* constant approprié. Vous pouvez ensuite l'utiliser avec n'importe quelle API qui vous permet de fournir votre propre variable SSLContext.

import ssl
import urllib2

ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
# set other SSLContext options you might need
response = urllib2.urlopen(url, context=ctx)

Pour utiliser une version de protocole particulière ou supérieure (y compris les versions futures), utilisez ssl.PROTOCOL_SSLv23, puis désactivez les versions de protocole que vous ne souhaitez pas utiliser:

ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23)

# allow TLS 1.2 and later
ctx.options |= ssl.OP_NO_SSLv2
ctx.options |= ssl.OP_NO_SSLv3
ctx.options |= ssl.OP_NO_TLSv1
ctx.options |= ssl.OP_NO_TLSv1_1

Quant à l’utilisation d’une SSLContext personnalisée avec des requêtes afin de forcer une version de protocole particulière, selon la documentation il ne semble pas y avoir de moyen de le faire, voir l’exemple suivant tiré de la documentation .

12
frasertweedale

Si la mise à niveau du code n'est pas une option, vous devriez pouvoir utiliser une connexion proxy avec un serveur squid ou nginx. Voici un exemple de méthode squid "bump":

Puis-je utiliser Squid pour mettre à niveau les connexions TLS du client?

Une autre option consiste à conserver le proxy, mais à réécrire l'URL (http à https) et à faire en sorte que votre application envoie des demandes à http (cela semble étrange, mais cela fonctionne s'il est correctement implémenté). 

0
TinuC