2015-02-23 14 views
9

Próba złożenia prostego żądania pobrania za pomocą sesji Żądania, ale nadal otrzymuję komunikat SSLerror dla określonej witryny. Myślę, że może problem dotyczy strony (zrobiłem skan używając https://www.ssllabs.com, wyniki są poniżej), ale nie mogę być pewny, ponieważ nie mam wiedzy w tej dziedzinie :) Na pewno chciałbym zrozumieć, co się dzieje.Prośby o Python uzyskiwanie SSLerror

Rozwiązanie/wyjaśnienie byłoby świetnie, dzięki!

Kod:

import requests 

requests.get('https://www.reporo.com/') 

Dostaję następny błąd:

SSLError: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')] 

--------------------------------------------------------------------------- 
SSLError         Traceback (most recent call last) 
<ipython-input-7-cfc21b287fee> in <module>() 
----> 1 requests.get('https://www.reporo.com/') 

/usr/local/lib/python2.7/dist-packages/requests/api.pyc in get(url, **kwargs) 
    63 
    64  kwargs.setdefault('allow_redirects', True) 
---> 65  return request('get', url, **kwargs) 
    66 
    67 

/usr/local/lib/python2.7/dist-packages/requests/api.pyc in request(method, url, **kwargs) 
    47 
    48  session = sessions.Session() 
---> 49  response = session.request(method=method, url=url, **kwargs) 
    50  # By explicitly closing the session, we avoid leaving sockets open which 
    51  # can trigger a ResourceWarning in some cases, and look like a memory leak 

/usr/local/lib/python2.7/dist-packages/requests/sessions.pyc in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json) 
    459   } 
    460   send_kwargs.update(settings) 
--> 461   resp = self.send(prep, **send_kwargs) 
    462 
    463   return resp 

/usr/local/lib/python2.7/dist-packages/requests/sessions.pyc in send(self, request, **kwargs) 
    571 
    572   # Send the request 
--> 573   r = adapter.send(request, **kwargs) 
    574 
    575   # Total elapsed time of the request (approximately) 

/usr/local/lib/python2.7/dist-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies) 
    429   except (_SSLError, _HTTPError) as e: 
    430    if isinstance(e, _SSLError): 
--> 431     raise SSLError(e, request=request) 
    432    elif isinstance(e, ReadTimeoutError): 
    433     raise ReadTimeout(e, request=request) 

SSLError: [Errno bad handshake] [('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')] 

wpadłem skanowanie w https://www.ssllabs.com i mam następujące:

SSL Report: reporo.com 
Assessed on: Sun Feb 22 21:42:57 PST 2015 | Clear cache Scan Another >> 

    Server Domain(s) Test time Grade 
1 154.51.128.13 
Certificate not valid for domain name 
reporo.com 
Sun Feb 22 21:40:53 PST 2015 
Duration: 9.167 sec - 
2 198.12.15.168 
protected.ddosdefend.com 
Ready 
www.reporo.com 

Sun Feb 22 21:41:02 PST 2015 
Duration: 115.189 sec 
F 
+0

Serwer używa nieprawidłowego certyfikatu, tak jak czytamy w raporcie. Dlatego "żądania" odmawiają połączenia, ponieważ przekaz informacji może nie być bezpieczny. – MattDMo

+0

Czy istnieje obejście, które można zastosować? –

Odpowiedz

17

samo świadectwo dla www.reporo.com (not reporo.com) jest ważne, ale brakuje w nim certyfikatu łańcucha, jak pokazano w raporcie przez ssllabs:

Chain issues Incomplete 
.... 
2 Extra download Thawte DV SSL CA 
Fingerprint: 3ca958f3e7d6837e1c1acf8b0f6a2e6d487d6762 

W "Niekompletna" i "Extra download" to główne punkty. Niektóre przeglądarki będą mieć buforowany brakujący bufor łańcucha, inne będą pobierać, a inne nie. Jeśli wypróbujesz witrynę ze świeżym profilem Firefoksa (który nie ma żadnych buforowanych certyfikatów), to również się nie powiedzie.

Można pobrać brakujące certyfikaty łańcucha i używać go jako zaufanego certyfikatu CA z parametrem verify dla żądań. Nie wyłączaj sprawdzania poprawności, ponieważ wtedy jesteś otwarty na ataki typu "man-in-the-middle".

Krok po kroku instrukcje:

+1

Czy możesz opracować sposób pobierania i używania certyfikatu CA? (lub linki na ten temat) temat jest dla mnie nowy i chciałbym uniknąć brudzenia :) –

+1

Dodałem instrukcje krok po kroku do odpowiedzi. –

+0

Próbowałem rozwiązania tego listu, o ile widzę, ale nadal otrzymuję SSLError: [Errno bad handshake] [("Procedury SSL", "SSL3_GET_SERVER_CERTIFICATE", "certyfikat nie weryfikuje")]. :/ –

4

Można wyłączyć weryfikację certyfikatu:

requests.get('https://www.reporo.com/', verify=False) 

ale bez weryfikacji certyfikatu nie ma man-in-the-middle attack ochrona.

+0

dziękuję, ale próbuję to zrobić bez weryfikacji = False –

+8

Nigdy nie sugeruj wyłączania sprawdzania poprawności bez wskazywania konsekwencji dla bezpieczeństwa. –

2

Miałem ten sam błąd. Obniżenie liczby żądań z wniosków - 2.17.3 do wniosków - 2.11.0 rozwiązało to dla mnie.

pip uninstall requests 
pip install requests==2.11.0 
1

Ran do podobnego problemu i ustala następujące:

pip install -U requests[security] 
Powiązane problemy