Ich habe eine kleine App, die ich in Python geschrieben habe, und sie funktionierte früher ... bis gestern, als plötzlich ein Fehler in einer HTTPS-Verbindung auftrat. Ich erinnere mich nicht, ob es ein Update gab, aber sowohl Python 2.7.3rc2 als auch Python 3.2 schlagen genauso fehl.
Ich habe es gegoogelt und festgestellt, dass dies passiert, wenn sich Personen hinter einem Proxy befinden, aber ich nicht (und nichts hat sich in meinem Netzwerk geändert, seitdem es das letzte Mal funktioniert hat). Der Computer meines Systers, auf dem Windows und Python 2.7.2 ausgeführt werden, weist keine Probleme auf (im selben Netzwerk).
>>> url = 'https://www.mediafire.com/api/user/get_session_token.php'
>>> response = urllib2.urlopen(url).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
return self.do_open(httplib.HTTPSConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno 8] _ssl.c:504: EOF occurred in violation of protocol>
Was ist falsch? Jede Hilfe wird geschätzt.
PS .: Ältere Python-Versionen funktionieren auch nicht, nicht in meinem System und nicht in einer Live-Sitzung von USB, sondern in einer Ubuntu 11.10-Live-Sitzung.
Antworten:
Dies scheint mit dem Hinzufügen von TLS 1.1- und 1.2-Unterstützung zu der Version von OpenSSL in Verbindung zu stehen, die in 12.04 gefunden wurde. Der Verbindungsfehler kann mit dem OpenSSL-Befehlszeilentool reproduziert werden:
Die Verbindung ist erfolgreich, wenn ich die Verwendung von TLS 1.0 mit dem
-tls1
Befehlszeilenargument erzwinge .Ich würde vorschlagen, dass Sie hier einen Fehlerbericht zu diesem Problem einreichen:
https://bugs.launchpad.net/ubuntu/+filebug
quelle
Für Python-Neulinge wie mich ist hier der einfachste Weg, httplib zu überschreiben. Fügen Sie oben in Ihrem Python-Skript die folgenden Zeilen ein:
Ab hier können Sie urllib oder was auch immer verwenden, wie Sie es normalerweise tun würden.
Hinweis: Dies ist für Python 2.7. Für eine Python 3.x-Lösung müssen Sie die HTTPSConnection-Klasse in http.client überschreiben. Ich überlasse das dem Leser als Übung. :-)
quelle
httplib
. Benutzer können andere SSL-Sockets verwenden. Man könntessl
stattdessen wie in meiner Antwort unten patchen .BadStatusLine: ''
Sie können das Ändern der Datei httplib.py vermeiden, indem Sie Ihr HTTPSConnection-Objekt ändern:
Die Anforderungsmethode erstellt nur dann einen neuen Socket, wenn connection.sock nicht definiert ist. Wenn Sie einen eigenen erstellen und den Parameter ssl_version hinzufügen, wird er von der Anforderungsmethode verwendet. Dann funktioniert alles andere wie gewohnt.
Ich hatte das gleiche Problem und das funktioniert für mich.
Grüße
quelle
Das Problem ist in
ssl
, es hat nichts mit HTTP zu tun hat, also warum das Patchen ,httplib
wenn Sie Patch kannssl
. Der folgende Code sollte alle SSL-Sockets einschließlich, aber nicht beschränkt auf HTTPS für Python 2.6+ beheben (eingebautssl
, nicht getestetpyopenssl
).quelle
EDIT httplib.py (/usr/lib/pythonX.X/httplib.py unter Linux)
FIND HTTPSConnection-Klassendeklaration
Innerhalb der Zeile mit dem Klassencode CHANGE
ZU
Dann sollte die HTTPS-Anforderung von httplib funktionieren
quelle
Dieses Problem ist wahrscheinlich darauf zurückzuführen, dass SSLv2 auf dem Webserver deaktiviert ist, Python 2.x jedoch standardmäßig versucht, eine Verbindung mit PROTOCOL_SSLv23 herzustellen.
Hier ist der Link zu meiner Antwort auf ein ähnliches Problem bei Stack Overflow - /programming//a/24166498/41957
Update: Funktionell entspricht dies der obigen Antwort von @ temoto.
quelle
Ein einfacher Fix, der für mich funktioniert hat, war, das Standardprotokoll von SSL zu überschreiben:
quelle