2013-09-25 4 views
13

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

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

Где Python/запросы хранят аналог ssh's known_hosts и как его очистить для этого хоста?

$ 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 
+5

Я не уверен, почему сертификат недействителен, но в качестве обходного пути вы можете использовать 'request.get (url, timeout = 5, config = {'danger_mode': True}, verify = False)' игнорировать сертификат SSL, как указано в [Дополнительная документация по использованию запросов] (http://www.python-requests.org/en/latest/user/advanced/). –

+1

@ У Андре Даниэля есть что 'config' удалено? Я не вижу его на связанной странице, и мой питон утверждает, что он неизвестен. И 'verify = False' в одиночку, похоже, не делает трюка ... – codeling

+0

@RandolphCarter Я просто посмотрел на страницу, и она все еще там, ищите« SSL Cert »(я хотел бы дать вам прямую ссылку, но Я нахожусь на своем телефоне и не могу этого сделать) ... –

ответ

4

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

+1

Оказалось, что при обновлении сервера установлен неподписанный или неправильно подписанный сертификат. HTTPS в браузере работал с Windows-машиной из-за различий в корневом сертификате между двумя ОС. Изменение IP не имело к этому отношения (за исключением путаных вещей). –

1

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

Изменение IP-адресов мало связано с проблемой, за исключением путаницы.

Продвижение мой комментарий к ответу, как:

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