Flask вызов https веб-службы приводит к ошибке ssl - PullRequest
1 голос
/ 19 февраля 2020

У меня есть Flask веб-сервис на базе REST-интерфейсов.

Мы написали класс веб-сервиса, унаследованный от flask.Flask, и не можем предоставить весь код здесь, но вызов приложения веб-сервиса выглядит так: app.run(host=host, port=port, ssl_context='adhoc)

При этом, когда я пытаюсь выполнить запрос GET, я получаю ошибку SSL,

  File "/opt/debesys/build/x86-64/debug/python/tt/pyrate/test/test_juno_sim.py", line 1077, in test_main_page
    resp = requests.get(self.url, headers=self.headers, verify=False)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
    resp = self.send(prep, **send_kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
    r = adapter.send(request, **kwargs)
  File "/opt/debesys/ext/linux/x86-64/release/lib/python2.7/site-packages/requests/adapters.py", line 382, in send
    raise SSLError(e, request=request)
SSLError: [Errno 1] _ssl.c:507: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Я также попытался запустить приложение, например, app.run(host=host, port=port, ssl_context=('cert.pem', 'key.pem')) Также используется модуль urllib2 для запроса на получение. вместо requests module.

Но получаю ту же ошибку. Если я попытаюсь запустить приложение без ssl_context и использовать http, то получу ответ успешно.

Здесь я использую headers = {'Content-Type': 'application/json'} и url = "https://127.0.0.1:{}".format(port)

[shrishinde@localhost debesys]$ wget https://127.0.0.1:47855/
--2020-02-19 13:03:25--  https://127.0.0.1:47855/
Connecting to 127.0.0.1:47855... connected.
OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
Unable to establish SSL connection.
[shrishinde@localhost debesys]$ wget http://127.0.0.1:47855/
--2020-02-19 13:03:28--  http://127.0.0.1:47855/
Connecting to 127.0.0.1:47855... connected.
HTTP request sent, awaiting response... 200 OK
Length: 31 [text/html]
Saving to: “index.html”

100%[=====================================================================================================================================================================>] 31          --.-K/s   in 0s      

2020-02-19 13:03:28 (6.25 MB/s) - “index.html” saved [31/31]

[shrishinde@localhost debesys]$

Обновление

Найденное решение: После наследования Flask мы переопределили метод Flask run, и вместо него используется WSGIServer ssl_context Я должен использовать ssl_args .

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

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

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

Подпрограммы SSL: SSL23_GET_SERVER_HELLO: неизвестный протокол

Эта ошибка возникает, когда OpenSSL получает неверный параметр рукопожатия с сервера. Это может произойти, если сервер отвечает простым HTTP (без TLS). Это может произойти по другим причинам: ваш клиент может не понимать версию TLS (библиотека поддерживает только SSL) или что-то в этом роде.

Попробуйте выполнить запрос с wget или Postman для URL ( http://your.url 422 ). Если вы получили ответ, SSL не включен.

Исправлено

Хорошо, я сумел воспроизвести вашу проблему, вы не запускаете сервер в режиме ssl , Запустите это.

pip install pyopenssl

python -m flask run --cert = adho c

И убедитесь, что сообщение выполняется на https://127.0.0.1: 5000 / , а затем закройте его и запустите с помощью

python -m flask run --cert = adho c -p [ваш порт]

Для запуска int в нужном порту

0 голосов
/ 19 февраля 2020

Без кода можно только догадываться.

Поскольку ошибка указывает unknown protocol, вы можете проверить, вызываете ли вы правильный протокол, например. не вызывать HTTPS вместо HTTP, что является распространенной ошибкой при разработке в вашей локальной среде.

...