Подтвердить что ты не робот

Сертификат pycurl и SSL

Я пытаюсь написать pycurl script для доступа к защищенному сайту (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 в моем локальном хранилище сертификатов. Кто-нибудь знает, как экспортировать мой сертификат и использовать его в моем коде. Некоторые примеры кода будут потрясающими.

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

4b9b3361

Ответ 1

Вы правы, то, как вы это делаете, подвергает вас атаке "человек в середине", особенно в свете самых последних уязвимостей 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()

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

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

Ответ 2

Вы прочитали документацию 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, поэтому это должно быть просто реализовать в вашем коде.