Запросы Python бросают ошибки SSL

Это продолжение SSLError с использованием запросов на python :

Я только что установил requests на Mac OSX 10.8.5. Моя первая попытка выполнить requests.get не удалось с отсутствием сертификата:

SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

  • В приведенном выше потоке говорится, что искать /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/re‌​quests/cacert.pem но на самом деле у меня даже нет .../site-packages/requests . Мне непонятно, если бы это было добавлено установкой (я использовал pip )

  • Дальнейшие потоки и requests docs говорят, чтобы установить certifi , поэтому я и сделал. Но теперь у меня другая ошибка:

     python -c 'import requests; requests.get("https://api.github.com/events")' /usr/lib/anaconda/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:90: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. InsecurePlatformWarning Traceback (most recent call last): ... File "/usr/lib/anaconda/lib/python2.7/site-packages/requests/adapters.py", line 431, in send raise SSLError(e, request=request) requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm 

Благодаря!

  • "SSL: certificate_verify_failed" python?
  • Запросы Python предоставляют протокол SSL неизвестный
  • Как открыть ssl-сокет, используя сертификат, хранящийся в строковых переменных в python
  • использование запросов с TLS не дает поддержки SNI
  • Интеграция AppEngine Paypal дает SSLCertificateError на localhost, используя Python
  • Использовать TLS и Python для аутентификации
  • Как заблокировать SSL-протоколы в пользу TLS?
  • Проверка соединения SSL с помощью python
  • One Solution collect form web for “Запросы Python бросают ошибки SSL”

    Обратите внимание, что вы используете HTTPS . Как упоминалось в Руководстве по запросам

    Чтобы проверить SSL-сертификат хоста, вы можете использовать аргумент проверки […] По умолчанию для проверки установлено значение True

    Вот несколько способов исправить это:

    Обновление OpenSSL (возможно, решит вашу проблему)

    Взято отсюда :

    Если вы столкнулись с одной из следующих ошибок:

     error:0D0890A1:asn1 encoding routines:ASN1_verify:unknown message digest algorithm error:0D0C50A1:asn1 encoding routines:ASN1_item_verify:unknown message digest algorithm The software you are using might be compiled with a version too old of OpenSSL that does not take certificates signed with sha256WithRSAEncryption into account. 

    Он требует, по крайней мере, OpenSSL 0.9.8o для общего управления SHA256. OpenSSl 0.9.7m обеспечивает только частичное управление только для режима сервера.

    Проверьте версию openssl на

     openssl version OpenSSL 1.0.1k-fips 8 Jan 2015 

    Если у вас меньшая версия, чем OpenSSL0.9.8o , вам необходимо обновить ее версию (OS X):

     brew update brew install openssl brew link --force openssl 

    Если это не сработает, попробуйте вот так:

     brew uninstall openssl rm -rf /usr/local/openssl brew install openssl 
    • есть проблема с openssl установленным до OS X 10.10.3 и переустановка его исправляет
    • эти командные строки удаляют openssl , удаляют его папку с вашего жесткого диска и устанавливают ее снова (обновленная версия)

    Установить certifi

    Взято отсюда

    По умолчанию Requests связывает набор корневых центров сертификации, которым он доверяет, из источника доверия Mozilla. Однако они обновляются только один раз для каждой версии запросов. Это означает, что если вы укажете версию «Запросы», ваши сертификаты могут стать крайне устаревшими.

    Начиная с запросов версии 2.4.0, запросы будут пытаться использовать сертификаты certifi, если они присутствуют в системе. Это позволяет пользователям обновлять свои доверенные сертификаты, не изменяя код, который выполняется в их системе.

    Для безопасности рекомендуем часто обновлять certifi!

    Другими словами, попробуйте установить certifi , если у вас есть Request 2.4.0 или новее:

     pip install certifi 

    Надеюсь, это устранит проблему.

    Использовать другую версию OpenSSL и Запросы

    Изучая его с помощью Google, я обнаружил, что проблема с OpenSSL в Python 2:

    Тем не менее, я использую Python 2.7.6 , Requests 2.2.1 и OpenSSL 1.0.1f 6 Jan 2014 и все работает правильно.

    Пропустить сертификат

    В других случаях вам может потребоваться указать requests.get путь к файлу сертификата, если сертификат хоста был подписан вами.

     requests.get("https://api.github.com/events", verify=True, cert=['/path/to/my/ca.crt']) 

    Установите аргумент проверки False (НЕ РЕКОМЕНДУЕТСЯ!)

    Если вы хотите избежать проверки сертификата, вам необходимо передать verify=False методу request.get .

     python -c 'import requests; requests.get("https://api.github.com/events", verify=False)' 

    или из файла script.py :

     import requests res = requests.get("https://api.github.com/events", verify=False) print res 

    Терминал:

     $ python script.py <Response [200]> 

    Важно : очень плохая идея; Вы можете атаковать MITM , что является критичной уязвимостью безопасности.

    Python - лучший язык программирования в мире.