2016-09-07 2 views
0

Ich versuche, eine Datei über https mit Anfragen 2.11.1 mit Python 2.7.12 und OpenSSL 1.0.2h zu bekommen (alles installiert von Anaconda) auf MacOS 10.11.6 hinter einem Proxy. Gemäß SSLLabs unterstützt der Server TLS 1.0, 1.1 und 1.2. Außerdem kann ich die Datei mit wget (verknüpft mit OpenSSL 1.0.2h) erfolgreich wiederherstellen, wenn ich das sichere Protokoll explizit auf tlsv1 setze (aber nicht, wenn ich es auf nicht unterstützte Protokolle wie sslv2 setze). wenn ich versuche, jedoch explizit das sicheres Protokoll von Anfragen an TLSv1, TLSv1_1 oder TLSv1_2 verwendet gesetzt, zum Beispiel wie folgt,https GET hinter Proxy ist erfolgreich mit wget + TLSv1, scheitert aber mit Anfragen, auch wenn ssl Protokoll gezwungen ist 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") 

ich die folgende Ausnahme auftreten:

/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')],)",) 

(Weniger überraschend Wenn Sie das Protokoll explizit auf SSLv2, SSLv3 oder SSLv23 setzen, führt dies auch zu Handshake-Ausnahmebedingungen. Auch beim Versuch, andere Websites über https zu erhalten, kann ich keine Ausnahme beobachten. Irgendeine Idee, warum die Verbindung mit Anforderungen fehlschlägt, selbst wenn ich es zwinge, TLSv1 zu verwenden?

+0

'https: // myurl ...' ist nicht sehr hilfreich. Macht SNI einen Unterschied? Ohne SNI: 'openssl s_client -connect : -tls1'. Mit SNI: 'openssl s_client -connect : -tls1-servername '. Siehe auch [SSLv3-Alert-Handshake-Fehler mit urllib2] (http://stackoverflow.com/q/30918761), was eine Python 2.7-Frage ist. – jww

+0

Explizite URI hinzugefügt. – lebedov

+0

Wo stellst du tls1 ein? Alles, was Sie tun, ist eine Variable p zu erstellen, die ssl.PROTOCOL_TLSv1 entspricht. Sie werden nichts einstellen. Was Sie tun müssen, ist dies https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/, ohne 's.mount ('https: //', some_adapter))' Sie können auch die gesamte Codezeile entfernen r = ... –

Antwort

0

Dieses Problem ist darauf zurückzuführen, dass der Proxy HTTP-Header mit nicht erkannten User-Agent-Zeichenfolgen ablehnt. Durch explizites Festlegen des Benutzeragenten in den Headern auf etwas wie Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) über eine gehackte Version von cntlm wurde das Problem gelöst.

Verwandte Themen