2015-06-18 12 views
5

Ho problemi di connessione con https utilizzando urllib2 in Python 2.7.10.Errore di handshake di avviso SSLv3 con urllib2

Qualche idea di cosa mi manca?

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

Questo problema non mi capita su Windows con Python 2.7.10. Ma mi capita su OS X con Python 2.7.11. Sto tentando di aprire PayPal. – user2233706

+0

Ho confermato che questo problema si verifica su OS X con Python 2.7.10. Quindi Windows con Python 2.7.10 funziona correttamente. – user2233706

risposta

2

sono stato in grado di duplicare il vostro problema su OS X 10.10.3, il cui magazzino Python è 2.7.6 costruito con OpenSSL 0.9.8zd.

Il problema è la mancanza del (SNI) estensione Server Name Indication nella stretta di mano TLS, che il sito richiede twitrss.me a quanto pare:

Server Name Indication (SNI) è un'estensione al computer TLS protocollo di rete tramite il quale un client indica quale nome host è tenta di connettersi all'inizio del processo di handshake.

Ho verificato questo scrivendo un piccolo programma C++ con OpenSSL, e inserendo la chiamata OpenSSL

SSL_set_tlsext_host_name(ssl, "twitrss.me"); 

permette una connessione omettendo fallisce. Ho anche esaminato i dump di pacchetti per verificare che mancasse SNI durante il tentativo di connessione usando Python.

Il modulo SSL Python apparentemente supports SNI in Python 3 ma may require a workaround in Python 2. Sembra che lo PEP 0466 includa SNI e sia atterrato in Python 2.7.9, quindi dovresti averlo, ma non so se sfruttare lo strumento urllib2/urllib3 senza la soluzione alternativa.

+1

* "Ho verificato ciò scrivendo un piccolo programma C++ ..." * - 'openssl s_client -connect twitrss.me:443 -tls1 -servername twitrss.me' funziona anche bene. Nessuna programmazione richiesta. '-servername' è l'opzione SNI. – jww

Problemi correlati