Python запрашивает сертификат, проверка не удалась

Я поддерживаю мини-приложение Python, которое использует запросы + HTTPS.

Приложение работало до тех пор, пока IP-адрес имени хоста в URL-адресе HTTPS не изменился (законно). Если я укажу свой браузер на URL-адрес, я могу получить его нормально.

Где Python/requests хранит аналог known_hosts ssh и как его очистить для этого хоста?

$ python --version
Python 2.7.3

$ cat foo.py 
import requests
url = "https://somehost/resource.json"
requests.get(url, timeout=5, config={'danger_mode': True})

$ source venv/bin/activate
$ python foo.py 
Traceback (most recent call last):
  File "foo.py", line 3, in <module>
    requests.get(url, timeout=5, config={'danger_mode': True})
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/api.py", line 65, in get
return request('get', url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/safe_mode.py", line 39, in wrapped
return function(method, url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/api.py", line 51, in request
return session.request(method=method, url=url, **kwargs)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/sessions.py", line 241, in request
r.send(prefetch=prefetch)
  File "/home/dfukdev/corsair-scripts/alfred/venv/local/lib/python2.7/site-packages/requests/models.py", line 641, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL     routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

person Garrett Smith    schedule 25.09.2013    source источник
comment
Я не уверен, почему сертификат недействителен, но в качестве обходного пути вы можете использовать requests.get(url, timeout=5, config={'danger_mode': True}, verify=False), чтобы игнорировать сертификат SSL, как указано в Запрашивает расширенную документацию по использованию.   -  person    schedule 25.09.2013
comment
@AndréDaniel, этот config был удален? Я не вижу его на связанной странице, и мой питон утверждает, что он неизвестен. И verify=False в одиночку, кажется, не помогает...   -  person codeling    schedule 27.08.2014
comment
@RandolphCarter Я только что просмотрел страницу, и она все еще там, найдите сертификат SSL (я бы хотел дать вам прямую ссылку, но я сижу на своем телефоне и не могу этого сделать) ...   -  person    schedule 27.08.2014
comment
@ AndréDaniel ах да, Verify все еще там. Я пропустил второй оператор reqeuests.get в моем скрипте, который также выдал эту ошибку;). Однако config={'danger_mode': True} больше не требуется - если я правильно прочитал это, теперь это значение по умолчанию. Спасибо за ваш молниеносный ответ!   -  person codeling    schedule 27.08.2014


Ответы (3)


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

person Ian Stapleton Cordasco    schedule 26.09.2013
comment
Оказалось, что при обновлении сервера был установлен неподписанный или неправильно подписанный сертификат. HTTPS в браузере работал на компьютере с Windows из-за различий в корневых сертификатах между двумя ОС. Изменение IP не имело к этому никакого отношения (кроме путаницы). - person Garrett Smith; 27.09.2013

Оказалось, что при упомянутом в вопросе апгрейде сервера был установлен неправильно подписанный сертификат. HTTPS в браузере работал из-за различий в корневых сертификатах между компьютером с браузером Windows и клиентом Ubuntu Python. HTTPS через браузер с того же компьютера с Ubuntu, на котором был запущен Python, выявил детали проблемы с сертификатом.

Смена IP не имела ничего общего с проблемой, кроме путаницы.

Продвижение моего комментария к ответу как:

  1. это ответил на мой вопрос
  2. этот вопрос получает достаточно трафика, я хотел бы поделиться знаниями.
person Garrett Smith    schedule 15.10.2015

Если вышеперечисленное не работает, и вы обнаружите, что это локально, то это решение сработало для меня...

По сути, запустите файл Install Certificates.command в папке Python.

https://www.dev2qa.com/how-to-fix-python-error-certificate-verify-failed-unable-to-get-local-issuer-certificate-in-mac-os/

person Christopher    schedule 10.03.2020