pycurl et SSL cert
J'essaie d'écrire un script pycurl pour accéder à un site sécurisé (HTTPS).
c = pycurl.Curl()
c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0')
c.setopt(pycurl.URL, 'https://for-example-securedsite')
c.setopt(pycurl.COOKIEFILE, 'cookie.txt')
c.setopt(pycurl.COOKIEJAR, 'cookies.txt')
c.setopt(pycurl.WRITEDATA, file("page.html","wb"))
Je reçois l'erreur ci-dessous..
Pycurl.erreur: (60, ' problème de certificat SSL, vérifiez que le certificat CA est OK. Détails: nerror: 14090086: routines SSL: SSL3_GET_SERVER_CERTIFICATE: la vérification du certificat a échoué')
Le code a échoué, car il n'a pas réussi à obtenir le certificat SSL.
L'erreur est partie si j'Ajoute les lignes ci-dessous à mon code.
c.setopt(pycurl.SSL_VERIFYPEER, 0)
c.setopt(pycurl.SSL_VERIFYHOST, 0)
Le code ci-dessus va sauter le la vérification du certificat. Mais il est soumis à l'attaque "homme au milieu".
Je sais que j'ai le certificat SSL dans mon magasin de certificats local. Faire que quelqu'un sait comment exporter mon certificat et utiliser mon code.. Certains exemples de codes seront impressionnants..
Merci pour votre temps!
2 réponses
Vous avez raison, la façon dont vous le faites vous soumet à une attaque man-in-the-middle, en particulier à la lumière des vulnérabilités SSL les plus récentes. Vous pouvez le résoudre comme suit:
import pycurl
curl = pycurl.Curl()
curl.setopt(pycurl.URL, "https://your-secure-website.com/")
curl.setopt(pycurl.SSL_VERIFYPEER, 1)
curl.setopt(pycurl.SSL_VERIFYHOST, 2)
curl.setopt(pycurl.CAINFO, "/path/to/updated-certificate-chain.crt")
curl.perform()
Curl par défaut est livré avec une liste de certificats obsolète. Que vous souhaitiez le mettre à jour ou simplement utiliser vos propres certificats pour les tests, assurez-vous de placer la chaîne updated-certificate-chain.fichier crt dans un emplacement accessible et utiliser le pycurl.Option CAINFO pour pointer vers elle.
Assurez-vous Également pycurl.SSL_VERIFYHOST est défini sur 2, le paramètre de vérification de sécurité le plus élevé.
Avez-vous lu la documentation cURL sur les certificats SSL? Cela semble aborder directement votre question...in particulier, point 2:
2. Get a CA certificate that can verify the remote server and use the proper
option to point out this CA cert for verification when connecting. For
libcurl hackers: curl_easy_setopt(curl, CURLOPT_CAPATH, capath);
Il semble que le module pycurl contienne l'option CAPATH
, donc cela devrait être simple à implémenter dans votre code.