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

Сенсорная панель Elantech распознается как мышь PS / 2 Ubuntu 13.10

использовать десятичные значения в качестве атрибутов params в c #?

Получить свойства classа с помощью Typcript

Фиксирование медленной начальной нагрузки для IIS

Установить фокус на EditText

В .NET 4.0 привязка OneWayToSource

Показывать дату в системном трее в Windows 10

Не удается прочитать файл конфигурации из-за недостаточных разрешений

Почему ls дает разные выходные данные при передаче по трубопроводам

Приложение зависает или «Не работает stream приложений FX» происходит во время активности приложения

Какова максимальная фактическая скорость передачи данных по протоколу 802.11g?

создание пользовательских ячеек таблицы в быстрых

Как объединить правила фильтрации в фильтрах сообщений в Thunderbird для создания более продвинутых критериев фильтра?

Spring Boot, Spring Data JPA с несколькими источниками данных

ReactJS Два компонента, сообщающие

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