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?
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 .
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é).