2015-06-18 9 views
5

Ich habe Probleme bei der Verbindung mit https mit urllib2 unter Python 2.7.10.SSLv3 Alarm Handshake Fehler mit Urllib2

Irgendwelche Gedanken, was ich vermisse?

Python 2.7.10 (default, Jun 18 2015, 10:53:24) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import ssl, urllib2 
>>> ssl.HAS_SNI 
True 
>>> ssl.OPENSSL_VERSION 
'OpenSSL 0.9.8o 01 Jun 2010' 
>>> opener = urllib2.build_opener() 
>>> opener.open('https://twitrss.me/') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/python2.7/lib/python2.7/urllib2.py", line 431, in open 
    response = self._open(req, data) 
    File "/usr/local/python2.7/lib/python2.7/urllib2.py", line 449, in _open 
    '_open', req) 
    File "/usr/local/python2.7/lib/python2.7/urllib2.py", line 409, in _call_chain 
    result = func(*args) 
    File "/usr/local/python2.7/lib/python2.7/urllib2.py", line 1240, in https_open 
    context=self._context) 
    File "/usr/local/python2.7/lib/python2.7/urllib2.py", line 1197, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590)> 
+0

Dieses Problem passiert mir unter Windows mit Python 2.7.10 nicht. Aber es passiert mir unter OS X mit Python 2.7.11. Ich versuche PayPal zu öffnen. – user2233706

+0

Ich habe bestätigt, dass dieses Problem auf OS X mit Python 2.7.10 passiert. Also Windows mit Python 2.7.10 funktioniert gut. – user2233706

Antwort

2

Ich war in der Lage, Ihr Problem auf OS X 10.10.3 zu vervielfältigen, zu deren Bestand Python ist 2.7.6 mit OpenSSL 0.9.8zd gebaut.

Das Problem ist der Mangel an der Server Name Indication (SNI) Erweiterung im Handshake TLS, die die twitrss.me Website offenbar erfordert:

Server Name Indication (SNI) ist eine Erweiterung des TLS Computer Netzwerkprotokoll, bei dem ein Client angibt, mit welchem ​​Hostnamen er sich zu Beginn des Handshake-Vorgangs verbinden möchte.

ich überprüft dies durch ein kleines C++ Programm mit OpenSSL Schreiben und Einfügen des OpenSSL Anruf

SSL_set_tlsext_host_name(ssl, "twitrss.me"); 

eine erfolgreiche Verbindung ermöglicht, während es nicht weggelassen werden. Ich habe auch nach Paketdumps gefragt, um zu überprüfen, ob SNI fehlte, wenn ich eine Verbindung mit Python versuchte.

Das Python SSL-Modul offenbar supports SNI in Python 3 aber may require a workaround in Python 2. Es scheint, dass PEP 0466 SNI enthält und in Python 2.7.9 gelandet ist, also sollten Sie es haben, aber ich weiß nicht, ob urllib2/urllib3 davon ohne die Problemumgehung profitieren.

+1

* "Ich habe dies verifiziert, indem ich ein kleines C++ Programm geschrieben habe ..." * - 'openssl s_client -connect twitrsss.me:443 -tls1 -servername twitrss.me' funktioniert auch gut. Keine Programmierung erforderlich. '-servername' ist die SNI-Option. – jww

Verwandte Themen