Запрос Python, бросающий SSLError

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

Traceback (most recent call last): File "./test.py", line 24, in  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 

Проблема, с которой вы столкнулись, вызвана ненадежным сертификатом SSL.

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

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

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

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

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

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

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

Источник: запросы – проверка сертификата SSL

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

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

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

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

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

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

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

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

$ 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] extras.

Я столкнулся с той же проблемой, и сертификат 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') и 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 

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

 sudo pip uninstall -y certifi sudo pip install certifi==2015.04.28 

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

windows

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

линукс

 # (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 

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

Обновить

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

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

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

 import urllib3 urllib3.disable_warnings() 

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

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

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

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

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

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

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

 import requests url = "Write your url here" returnResponse = requests.get(url, verify=False) 

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

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

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

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

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

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

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

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

 sudo apt-get install ca-certificates 

Обновление времени также может решить следующее:

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

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

Я боролся с этой проблемой за ЧАСЫ.

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

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

В настоящее время проблема в модуле запросов вызывает эту ошибку, представленную в версиях 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' для этой проблемы является добавление следующей строки: 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'

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

Если вызовы запросов спрятаны где-то глубоко в коде, и вы не хотите устанавливать сертификат сервера, то только для целей отладки можно запросить 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!') 

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

Невозможно добавить опции, если запросы вызывают из другого пакета. В этом случае добавление сертификатов в пакет cacert – это прямой путь, например, мне пришлось добавить «StartCom Class 1 Primary Intermediate Server CA», для которого я загрузил корневой сертификат в 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 

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

У меня была аналогичная или одна и та же проблема проверки сертификатов. Я читал, что версии 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()) 

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

 pyenv virtualenv 3.4.6 myvenv pyenv activate myvenv pip install -r requirements.txt 
Interesting Posts

Как узнать, какая материнская плата находится на моем компьютере?

Установка ОС Windows из другой системы Windows

Почему некоторые файлы и коллекция файлов так долго копируются?

Могу ли я получить разрешение 2560 x1600 на моем dell 3007wfp-hc, используя соединение hdmi на моем рабочем столе dell I660s /

Как использовать базовую аутентификацию с помощью Volley на Android?

Является ли JPEG без потерь, когда для качества установлено значение 100?

Совместное использование двух подключений к Интернету на моем ноутбуке под управлением Windows XP

C # самый быстрый способ смены массива

Выберите NA в таблице данных в R

Есть ли слушатель, когда WebView отображает его содержимое?

Принтер PDF без вмешательства пользователя

Каково ключевое слово forSome в Scala?

Значение по умолчанию для параметра при передаче по ссылке в C ++

Линия до и после названия над изображением

Выбор между .bashrc, .profile, .bash_profile и т. Д.

Давайте будем гением компьютера.