2015-06-18 33 views
5

Mam problemy z łączeniem się z https za pomocą urllib2 w Pythonie 2.7.10.Błąd uzgadniania alertu SSLv3 z urllib2

Jakieś myśli o tym, czego mi brakuje?

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

Ten problem nie dotyczy mnie w systemie Windows z Pythonem 2.7.10. Ale zdarza mi się to na OS X z Pythonem 2.7.11. Próbuję otworzyć PayPal. – user2233706

+0

Potwierdziłem, że problem ten występuje w systemie OS X z Pythonem 2.7.10. Tak więc Windows z Pythonem 2.7.10 działa dobrze. – user2233706

Odpowiedz

2

byłem w stanie odtworzyć problemu na OS X 10.10.3, której akcje Python 2.7.6 jest zbudowany z OpenSSL 0.9.8zd.

Problemem jest brak w Server Name Indication (SNI) rozszerzenia w uzgadniania TLS, których teren twitrss.me najwyraźniej wymaga:

Nazwa serwera Wskazanie (SNI) jest rozszerzeniem do komputera TLS protokół sieciowy, za pomocą którego klient wskazuje, z której nazwy hosta próbuje się połączyć na początku procesu uzgadniania.

I zweryfikowane przez to pisanie mały program w C++ z OpenSSL i wstawienie połączenia OpenSSL

SSL_set_tlsext_host_name(ssl, "twitrss.me"); 

umożliwia udane połączenie pomijając to się nie powiedzie. Przyjrzałem się także zrzutom pakietów, aby sprawdzić, czy brakowało SNI podczas próby połączenia za pomocą Pythona.

Moduł Python SSL najwyraźniej supports SNI in Python 3, ale may require a workaround in Python 2. Wygląda na to, że PEP 0466 zawiera SNI i wylądował w Pythonie 2.7.9, więc powinieneś go mieć, ale nie wiem, czy skorzystał z tego urllib2/urllib3 bez obejścia.

+1

* "Zweryfikowałem to, pisząc mały program w C++ ..." * - 'openssl s_client -connect twitrss.me:443 -tls1 -servername twitrss.me' również działa poprawnie. Nie wymaga programowania. '-servername' jest opcją SNI. – jww