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
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:
chain.pem
. Assurez-vous que chacun des fichiers se termine par un caractère de fin de ligne valide (qu’ils ne téléchargent pas). Le fichier résultant devrait ressembler à comme ceci .Modifier votre appel à
requests.get('https://www.reporo.com/', verify = 'chain.pem')
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 .
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
Couru dans un problème similaire et résolu en suivant:
pip install -U requests[security]