J'essaie d'obtenir un fichier via https en utilisant les demandes 2.11.1 avec Python 2.7.12 et OpenSSL 1.0.2h (tous installés à partir d'Anaconda) sur MacOS 10.11.6 à partir d'un proxy. Selon SSLLabs, le serveur prend en charge TLS 1.0, 1.1 et 1.2. De plus, je peux récupérer le fichier avec wget (lié à OpenSSL 1.0.2h) si je définis explicitement le protocole sécurisé sur tlsv1 (mais pas si je le mets à des protocoles non supportés comme sslv2). Cependant, si je tente de définir explicitement le protocole sécurisé utilisé par les demandes à TLSv1, TLSv1_1 ou TLSv1_2, par exemple, comme suit,https Get derrière proxy réussit avec wget + TLSv1, mais échoue avec les demandes même si le protocole ssl est forcé à TLSv1
from requests_toolbelt import SSLAdapter
import requests
import ssl
s = requests.Session()
p = ssl.PROTOCOL_TLSv1
s.mount('https://', SSLAdapter(p))
r = s.get("https://anaconda.org/conda-forge/matplotlib/2.0.0b3/download/osx-64/matplotlib-2.0.0b3-np111py27_5.tar.bz2")
je rencontre l'exception suivante:
/Users/lebedov/anaconda2/lib/python2.7/site-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
495 except (_SSLError, _HTTPError) as e:
496 if isinstance(e, _SSLError):
--> 497 raise SSLError(e, request=request)
498 elif isinstance(e, ReadTimeoutError):
499 raise ReadTimeout(e, request=request)
SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_RECORD', 'wrong version number')],)",)
(moins surprenant La définition explicite du protocole sur SSLv2, SSLv3 ou SSLv23 entraîne également des exceptions de prise de contact. De même, je n'observe aucune exception lorsque j'essaie d'obtenir d'autres sites via https. Une idée de pourquoi la connexion échoue avec des requêtes même quand je l'oblige à utiliser TLSv1?
'https: // myurl ...' n'est pas très utile. Est-ce que SNI fait la différence? Sans SNI: 'openssl s_client -connect: -tls1'. Avec SNI: 'openssl s_client -connect : -tls1 -servername '. Voir également [Échec de l'établissement de liaison d'alerte SSLv3 avec urllib2] (http://stackoverflow.com/q/30918761), qui est une question Python 2.7. –
jww
URI explicite ajouté. – lebedov
Où configurez-vous tls1? tout ce que vous faites est de créer une variable p égale à ssl.PROTOCOL_TLSv1, vous ne définissez rien. Ce que vous devez faire est https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/, sans 's.mount ('https: //', some_adapter))' vous pouvez aussi supprimer toute la barre de code r = ... –