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!

22
demandé sur K2M 2011-12-01 00:40:02

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é.

18
répondu Suman 2012-10-25 16:05:03

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.

1
répondu larsks 2011-11-30 20:43:35