web-dev-qa-db-fra.com

pycurl et cert SSL

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.error: (60, 'Problème de certificat SSL, vérifiez que le certificat CA est OK. Détails:\nerror: 14090086: Routines SSL: SSL3_GET_SERVER_CERTIFICATE: échec de vérification du certificat')

Le code a échoué, car il n'a pas réussi à obtenir le certificat SSL.

L'erreur a disparu 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 ignorera la vérification du certificat. Mais son soumis à l'attaque de "l'homme au milieu".

Je sais que j'ai le certificat SSL dans mon magasin de certificats local. Est-ce que quelqu'un sait comment exporter mon certificat et l'utiliser avec mon code .. Certains exemples de codes seront géniaux ..

Merci pour votre temps!

26
K2M

Vous avez raison, la façon dont vous le faites vous soumet à une attaque de l'homme du milieu, surtout à 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ètes. Que vous souhaitiez le mettre à jour ou simplement utiliser vos propres certificats pour les tests, assurez-vous de placer le fichier updated-certificate-chain.crt dans un emplacement accessible et utilisez l'option pycurl.CAINFO pour le pointer.

Assurez-vous également que pycurl.SSL_VERIFYHOST est défini sur 2, le paramètre de contrôle de sécurité le plus élevé.

24
Suman

Avez-vous lu la documentation cURL sur les certificats SSL ? Cela semble répondre directement à votre question ... en particulier, le 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
larsks