Pycurl и SSL-сертификат - PullRequest
       10

Pycurl и SSL-сертификат

24 голосов
/ 01 декабря 2011

Я пытаюсь написать скрипт Pycurl для доступа к защищенному сайту (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"))   

Я получаю сообщение об ошибке ниже.

pycurl.error: (60, 'проблема с сертификатом SSL, проверьте, что сертификат CA в порядке. Подробности: \ nerror: 14090086: процедуры SSL: SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата')

Код не выполнен, так как не удалось получить сертификат SSL.

Ошибка исчезнет, ​​если я добавлю следующие строки в свой код.

c.setopt(pycurl.SSL_VERIFYPEER, 0)   
c.setopt(pycurl.SSL_VERIFYHOST, 0)

Приведенный выше код пропустит проверку сертификата. Но он подвергся атаке «человек посередине».

Я знаю, что у меня есть сертификат SSL в моем локальном хранилище сертификатов. Кто-нибудь знает, как экспортировать мой сертификат и использовать его мой код .. Некоторые примеры кодов будут удивительными ..

Спасибо за ваше время!

Ответы [ 2 ]

23 голосов
/ 25 октября 2012

Вы правы, то, как вы это делаете, подвергает вас атаке "человек посередине", особенно в свете последней уязвимости SSL . Вы можете решить это следующим образом:

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 по умолчанию поставляется с устаревшим списком сертификатов. Если вы хотите обновить его или просто использовать свои собственные сертификаты для тестирования, обязательно поместите файл updated-certificate-chain.crt в доступное место и используйте параметр pycurl.CAINFO, чтобы указать на него.

Также убедитесь, что для pycurl.SSL_VERIFYHOST установлено значение 2, самое высокое значение проверки безопасности.

1 голос
/ 01 декабря 2011

Читали ли вы документацию cURL о сертификатах SSL ? Похоже, это напрямую касается вашего вопроса ... в частности, пункт 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);

Похоже, что модуль pycurl содержит опцию CAPATH, поэтому это должно быть просто реализовать в вашем коде.

...