gevent и SSL вызывают нарушение протокола EOF

Я пытаюсь запустить простое приложение с поддержкой SSL, используя gevent.pywsgi WSGIServer. Тем не менее, я продолжаю получать SSLError: [Errno 8] _ssl.c:510: EOF occurred in violation of protocol примерно через 10-15 секунд после первого запроса (из Chrome), во время которого я предполагаю попытку повторного рукопожатия:

Traceback (most recent call last):
  File "D:\SOMEPATH\lib\site-packages\gevent\greenlet.py", line 327, in run
    result = self._run(*self.args, **self.kwargs)
  File "D:\SOMEPATH\lib\site-packages\gevent\server.py", line 102, in wrap_socket_and_handle
    ssl_socket = self.wrap_socket(client_socket, **self.ssl_args)
  File "D:\SOMEPATH\lib\site-packages\gevent\ssl.py", line 383, in wrap_socket
    ciphers=ciphers)
  File "D:\SOMEPATHK\lib\site-packages\gevent\ssl.py", line 94, in __init__
    self.do_handshake()
  File "D:\SOMEPATH\lib\site-packages\gevent\ssl.py", line 305, in do_handshake
    return self._sslobj.do_handshake()
    SSLError: [Errno 8] _ssl.c:510: EOF occurred in violation of protocol
<Greenlet at 0x4998850: <bound method WSGIServer.wrap_socket_and_handle of <WSGIServer at 0x499d6d0 fileno=500 address=127.0.0.1:12344>>(<socket at 0x49f50d0 fileno=912 sock=127.0.0.1:123, ('127.0.0.1', 6398))> failed with SSLError

Страница загружается просто отлично. Мой минимальный рабочий пример выглядит следующим образом:

from gevent import monkey
monkey.patch_all()

from gevent import ssl
from flask import Flask
from gevent.pywsgi import WSGIServer

app = Flask(__name__)

@app.route('/')
def main():
   return 'hi!'

server = WSGIServer(
    ('127.0.0.1', 12344),
    app,
    keyfile='server.key',
    certfile='server.crt',
    ssl_version=ssl.PROTOCOL_TLSv1,
)

print 'Serving..'

server.serve_forever()
  1. Я попытался принудительно использовать версию протокола TLSv1, как предлагалось во многих других потоках, большинство из которых ссылаются на этот ответ. Это можно увидеть в MWE.
  2. Я убедился, что не получаю никаких ошибок, используя неgevent встроенный сервер Flask по умолчанию, с настройкой SSL аналогично этого фрагмента.
  3. Изучение источников. В конце концов, исключение возникает из-за обернутой функции C после того, как несколько SSL_ERROR_WANT_READ "исключений" обрабатываются в do_handshake().

Сейчас я использую gevent==1.0.1 и Python 2.7.8 (default, Jun 30 2014, 16:03:49) на компьютере с Windows.

Как избавиться от этой ошибки?


person Jan Benes    schedule 12.01.2015    source источник
comment
Вы пробовали этот ответ stackoverflow.com/a/24166498/41957?   -  person chnrxn    schedule 09.04.2015
comment
Вы когда-нибудь находили решение?   -  person webjunkie    schedule 13.08.2015
comment
@webjunkie Нет, в итоге я использовал Nginx в качестве прокси для своего SSL, см. github.com /miguelgrinberg/Flask-SocketIO/issues/88 . Я не думаю, что вы получите большую помощь в решении вышеуказанной проблемы, похоже, что все откладывают работу с SSL до прокси-сервера, поэтому им не нужно иметь дело с этим в своем приложении.   -  person Jan Benes    schedule 15.08.2015


Ответы (2)


Убедитесь, что вы указали полный путь к своим файлам server.key и server.crt.

Кроме того, при отправке HTTP-запроса к серверу не забудьте указать «https» в https://127.0.0.1:12344/.

person aks    schedule 30.03.2016

Вероятно, это связано с тем, что при использовании gevent сервер (или клиент) не гарантирует немедленный ответ на рукопожатие, а время соединения истекает.

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

person Ojomio    schedule 10.10.2018