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?
'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
Explizite URI hinzugefügt. – lebedov
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 = ... –