web-dev-qa-db-fra.com

Requêtes Python obtenant SSLerror

Essayer de faire une simple requête get en utilisant la session Requests mais je continue à avoir SSLerror pour un site spécifique. Je pense que le problème vient peut-être du site (j’ai fait un scan avec https://www.ssllabs.com , les résultats sont plus bas), mais je ne peux pas en être sûr car je n’ai aucune connaissance dans ce domaine :) J'aimerais bien comprendre ce qui se passe.

Une solution/explication serait géniale, merci! 

Le code:

import requests

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

Je reçois la prochaine erreur:

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')]

J'ai effectué un scan sur https://www.ssllabs.com et j'ai obtenu ce qui suit:

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
12
Captain_Meow_Meow

Le certificat lui-même pour www.reporo.com (pas reporo.com) est valide, mais il manque un certificat de chaîne, comme indiqué dans le rapport par ssllabs :

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

"Incomplete" et "Extra download" sont les points principaux. Le certificat de chaîne manquant sera mis en cache sur certains navigateurs, sur le téléchargement et sur d'autres échouera. Si vous essayez le site avec un nouveau profil Firefox (pour lequel aucun certificat n'a été mis en cache), il échouera également.

Vous pouvez télécharger les certificats de chaîne manquants et les utiliser en tant que certificat d'autorité de certification approuvé avec le paramètre verify pour les demandes. Ne désactivez pas simplement la validation, car vous êtes alors ouvert aux attaques de type homme du milieu.

Instruction pas à pas:

20
Steffen Ullrich

Vous pouvez désactiver la vérification du certificat:

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

mais sans vérification du certificat, il n'y a pas de protection attaque par interception .

4
Colin

J'ai eu la même erreur. Le déclassement des requêtes de 2.17.3 à request-2.11.0 l'a résolu pour moi 

pip uninstall requests
pip install requests==2.11.0
2
Aleksei Denisov

Couru dans un problème similaire et résolu en suivant:

pip install -U requests[security]
1
Deqing