it-swarm.com.ru

Python запрашивает выбрасывание SSLError

Я работаю над простым сценарием, который включает в себя CAS, проверку безопасности jspring, перенаправление и т.д. Я хотел бы использовать запросы Python от Кеннета Рейтца, потому что это отличная работа! Тем не менее, CAS требует проверки через SSL, поэтому мне нужно сначала пройти этот шаг. Я не знаю, чего хотят запросы Python? Где должен находиться этот сертификат SSL?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/Egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/Egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/Egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/Egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/Egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/Egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
252
TedBurrows

Возникшая проблема вызвана ненадежным сертификатом SSL.

Как и @dirk, упомянутый в предыдущем комментарии, исправление самое быстрое устанавливает verify=False:

requests.get('https://example.com', verify=False)

Обратите внимание, что это приведет к тому, что сертификат не будет проверен. Это подвергнет ваше приложение угрозам безопасности, таким как атаки «человек посередине». 

Конечно, применять суждение. Как упоминалось в комментариях, это может будет приемлемо для быстрых/одноразовых приложений/скриптов, но на самом деле не должно переходить в производственное программное обеспечение

Если просто пропустить проверку сертификата неприемлемо в вашем конкретном контексте, рассмотрите следующие варианты, лучше всего установить параметр verify в строку, которая является путем к файлу .pem сертификата (который вы должны получить каким-то образом безопасных средств).

Таким образом, начиная с версии 2.0, параметр verify принимает следующие значения с соответствующей семантикой:

  • True: вызывает проверку сертификата по отношению к собственным доверенным центрам сертификации библиотеки (Примечание: вы можете увидеть, какие запросы корневых сертификатов используются через библиотеку Certifi, базу данных доверия RC, извлеченную из запросов: Certifi - База данных доверия для людей ) ,.
  • False: обходит проверку сертификата полностью.
  • Путь к файлу CA_BUNDLE для запросов, используемых для проверки сертификатов.

Источник: Запросы - Проверка SSL сертификата

Также взгляните на параметр cert в той же ссылке.

322
Rafael Almeida

Из запросов документация по проверке SSL :

Запросы могут проверять сертификаты SSL для запросов HTTPS, как веб-браузер. Чтобы проверить SSL-сертификат хоста, вы можете использовать аргумент проверки:

>>> requests.get('https://kennethreitz.com', verify=True)

Если вы не хотите подтверждать свой SSL-сертификат, сделайте verify=False 

96
Boud

Имя файла CA, который вы можете использовать, можно передать через verify:

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

Если вы используете verify=True, то requests использует свой собственный набор CA, который может не иметь CA, подписавшего сертификат вашего сервера.

44
jfs

$ pip install -U requests[security]

  • Протестировано на Python 2.7.6 @ Ubuntu 14.04.4 LTS
  • Протестировано на Python 2.7.5 @ MacOSX 10.9.5 (Mavericks)

Когда этот вопрос был открыт (2012-05), версия запросов была 0.13.1. В версии 2.4.1 (2014-09) были введены дополнительные функции безопасности, использующие пакет certifi, если он доступен. 

Прямо сейчас (2016-09) основной версией является 2.11.1, которая работает хорошо безverify=False. Нет необходимости использовать функцию requests.get(url, verify=False), если она установлена ​​с дополнительными функциями requests[security].

30
alanjds

Я столкнулся с той же самой проблемой, и ssl сертификат проверяет ошибку при использовании aws boto3, просмотрев код boto3, я обнаружил, что REQUESTS_CA_BUNDLE не установлен, поэтому я исправил обе проблемы, установив его вручную:

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

Для aws-cli я полагаю, что установка REQUESTS_CA_BUNDLE в ~/.bashrc решит эту проблему (не проверялось, потому что мой aws-cli работает без него).

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE
23
Yong

Если у вас есть библиотека, использующая requests, и вы не можете изменить путь проверки (например, с pyvmomi), то вам нужно будет найти cacert.pem в комплекте с запросами и добавить туда свой CA. Вот общий подход к поиску местоположения cacert.pem:

окна

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.Egg\requests\cacert.pem

Linux

#  (py2.7.5,requests 2.7.0, verify not enforced)
[email protected]:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
[email protected]:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem

кстати. @ questions-devs, связывание ваших собственных cacerts с запросом действительно очень раздражает ... особенно тот факт, что вы, кажется, не используете систему ca store в первую очередь, и это нигде не задокументировано.

Обновление

в ситуациях, когда вы используете библиотеку и не можете управлять местоположением ca-bundle, вы также можете явно установить местоположение ca-bundle в качестве вашего ca-bundle для всего хоста:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"
14
tintin

Я сталкиваюсь с той же проблемой, используя gspread, и эти команды работают для меня:

Sudo pip uninstall -y certifi
Sudo pip install certifi==2015.04.28
13
user941581

Если вы хотите удалить предупреждения, используйте код ниже.

import urllib3

urllib3.disable_warnings()

и verify=False с помощью метода request.get или post

10
AniketGole

Я нашел конкретный подход для решения аналогичной проблемы. Идея состоит в том, чтобы указать файл cacert, хранящийся в system и используемый другими приложениями на основе ssl.

В Debian (я не уверен, что то же самое в других дистрибутивах) файлы сертификатов (.pem) хранятся в /etc/ssl/certs/ Итак, этот код работает для меня:

import requests
verify='/etc/ssl/certs/cacert.org.pem'
response = requests.get('https://lists.cacert.org', verify=verify)

Чтобы угадать, какой файл pem выбрать, я просматриваю URL и проверяю, какой центр сертификации (CA) сгенерировал сертификат.

Правка: если вы не можете редактировать код (потому что вы запускаете третье приложение), вы можете попытаться добавить сертификат pem непосредственно в /usr/local/lib/python2.7/dist-packages/requests/cacert.pem (например, скопировать его в конец файла).

10
chk

Если вы не беспокоитесь о сертификате, просто используйте verify=False.

import requests

url = "Write your url here"

returnResponse = requests.get(url, verify=False)
9
yogesh prasad

После нескольких часов отладки я смог заставить его работать только с помощью следующих пакетов:

requests[security]==2.7.0  # not 2.18.1
cryptography==1.9  # not 2.0

используя OpenSSL 1.0.2g 1 Mar 2016

Без этих пакетов verify=False не работал.

Я надеюсь, что это помогает кому-то.

7
michael

Я столкнулся с той же проблемой. Оказывается, я не установил промежуточный сертификат на моем сервере (просто добавьте его в конец вашего сертификата, как показано ниже).

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

Убедитесь, что у вас установлен пакет ca-Certificates:

Sudo apt-get install ca-certificates

Обновление времени также может решить эту проблему:

Sudo apt-get install ntpdate
Sudo ntpdate -u ntp.ubuntu.com

Если вы используете самозаверяющий сертификат, вам, вероятно, придется добавить его в вашу систему вручную.

5
Marius Craciunoiu

Я боролся с этой проблемой в течение ЧАСОВ. 

Я пытался обновить запросы. Затем я обновил сертификат. Я указал check to certifi.where () (код делает это по умолчанию в любом случае). Ничего не получалось.

Наконец я обновил свою версию python до python 2.7.11. Я был на Python 2.7.5, у которого были некоторые несовместимости с способом проверки сертификатов. Как только я обновил Python (и несколько других зависимостей), он начал работать.

3
ajon

В настоящее время существует проблема в модуле запросов, вызывающая эту ошибку, которая присутствует в версиях от v2.6.2 до v2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573

Обойти эту проблему можно, добавив следующую строку: requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'

2
Peter

Я полагаю, слишком поздно для вечеринки, но я хотел вставить исправление для таких странников, как я! Так что на Python 3.7.x у меня сложилось следующее

Введите следующее в вашем терминале 

pip install --upgrade certifi      # hold your breath..

Попробуйте снова запустить скрипт/запросы и посмотреть, работает ли он (я уверен, что он еще не будет исправлен!). Если это не сработало, попробуйте запустить следующую команду в терминале напрямую.

open /Applications/Python\ 3.6/Install\ Certificates.command  # please replace 3.6 here with your suitable python version
1
d-coder

Как упомянул @Rafael Almeida, проблема, с которой вы столкнулись, вызвана ненадежным сертификатом SSL. В моем случае SSL-сертификат не был доверен моему серверу. Чтобы обойти это без ущерба для безопасности, я скачал сертификат и установил его на сервере (просто дважды щелкнув по файлу .crt и затем установив сертификат ...).

1
Michael

Если вызовы запросов скрыты где-то глубоко в коде, и вы не хотите устанавливать сертификат сервера, то только для только для целей отладки , возможно выполнить запросы monkeypatch:

import requests.api
import warnings


def requestspatch(method, url, **kwargs):
    kwargs['verify'] = False
    return _origcall(method, url, **kwargs)

_origcall = requests.api.request
requests.api.request = requestspatch
warnings.warn('Patched requests: SSL verification disabled!')

Никогда не используйте в производстве!

1
xmedeko

В моем случае причина была довольно тривиальной.

Я знал, что проверка SSL работала несколько дней назад и фактически работала на другом компьютере.

Следующим моим шагом было сравнение содержимого и размера сертификата между машиной, на которой работала проверка, и той, на которой ее не было.

Это быстро привело меня к определению, что сертификат на «неправильно» работающей машине не был хорош, и как только я заменил его на «хороший» сертификат, все было хорошо.

0
mastDrinkNimbuPani

Невозможно добавить опции, если запросы вызываются из другого пакета. В этом случае добавление сертификатов в пакет cacert является прямым путем, например, Мне пришлось добавить «Первичный промежуточный сервер CA класса StartCom Class 1», для которого я загрузил корневой сертификат в StartComClass1.pem. учитывая, что мой virtualenv называется caldav, я добавил сертификат с:

cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem
cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem

одного из тех может хватить, я не проверял

0
rhoerbe

У меня была похожая или та же проблема сертификации. Я читал, что версии OpenSSL менее 1.0.2, запросы которых зависят от того, иногда возникают проблемы при проверке надежных сертификатов (см. здесь ). Кажется, что CentOS 7 использует 1.0.1e, которая, похоже, имеет проблему. 

Я не был уверен, как обойти эту проблему на CentOS, поэтому я решил разрешить более слабые 1024-битные сертификаты CA. 

import certifi # This should be already installed as a dependency of 'requests'
requests.get("https://example.com", verify=certifi.old_where())
0
Tim Ludwinski

Мне пришлось обновить с Python 3.4.0 до 3.4.6

pyenv virtualenv 3.4.6 myvenv
pyenv activate myvenv
pip install -r requirements.txt
0
Paul