Запросы 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 

Благодаря!

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 , что является критичной уязвимостью безопасности.

Interesting Posts

Преобразование массива numpy в кортеж

Создать ограниченные случайные числа?

чтение подчиненного устройства, чтение-запись

Возврат строки из CSV, если указанное значение в строке соответствует условию

Как я могу подтвердить, что доменное имя соответствует RFC 1035 с использованием Python?

Заполнение словаря из списка

Динамическое обновление полосы в matplotlib

Как запускать программы в python2 и python3

обнаружить / удалить непарный суррогатный символ в Python 2 + GTK

Минималистичное отображение в реальном времени в Python

Как проверить, что матрица содержит нулевой столбец?

openshift: невозможно установить lxml для приложения python

Использование hashlib для вычисления md5 digest файла в Python 3

Как заставить Hadoop найти импортированные модули Python при использовании Python UDF в Pig?

Windows 8: `node-gyp rebuild` Состояние выхода 1 установка контекстуализируется как зависимость зомби

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