2016-09-07 2 views
0

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?

+0

'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

+0

URI explicite ajouté. – lebedov

+0

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 = ... –

Répondre

0

Ce problème s'est avéré dû au proxy rejetant les en-têtes HTTP avec des chaînes d'agent utilisateur non reconnues. La définition explicite de l'agent utilisateur dans les en-têtes à quelque chose comme Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) via une version piratée de cntlm a résolu le problème.