Почему Flask SocketIO Gevent выдает мне ошибки SSL EOF?

#python-2.7 #ssl #flask #gevent #flask-socketio

#python-2.7 #ssl #flask #gevent #flask-socketio

Вопрос:

Это простой фрагмент кода, который последовательно повторяет проблему, с которой я сталкиваюсь. Я использую Python 2.7.12, Flask 0.11, Flask-SocketIO 2.7.1 и gevent 1.1.2. Я понимаю, что это, вероятно, проблема, о которой лучше сообщить в список рассылки ответственного пакета, но я не могу понять, какой из них отвечает. Тем не менее, я почти уверен, что это проблема с gevent, потому что это то, что вызывает исключение.

 from flask import Flask
from flask_socketio import SocketIO

from gevent import monkey
monkey.patch_all()

import ssl

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'

socketio = SocketIO(app, async_mode='gevent')

@app.route('/')
def index():
    return "Hello World!"

@socketio.on('connect')
def handle_connect_event():
    print('Client connected')

if __name__ == '__main__':
    socketio.run(app, host='127.0.0.1', port=8443,
                 certfile='ssl/server/server.cer', keyfile='ssl/server/server.key',
                 ca_certs='ssl/server/ca.cer', cert_reqs=ssl.CERT_REQUIRED,
                 ssl_version=ssl.PROTOCOL_TLSv1_2)
  

И вот ошибка, которую я получаю при подключении клиента:

 Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/gevent/greenlet.py", line 534, in 
    result = self._run(*self.args, **self.kwargs)
  File "/usr/lib/python2.7/site-packages/gevent/baseserver.py", line 25, in
    return handle(*args_tuple)
  File "/usr/lib/python2.7/site-packages/gevent/server.py", line 126, in wr
    ssl_socket = self.wrap_socket(client_socket, **self.ssl_args)
  File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 691, i
    ciphers=ciphers)
  File "/usr/lib/python2.7/site-packages/gevent/_sslgte279.py", line 271, i
    raise x

    SSLEOFError: EOF occurred in violation of protocol (_ssl.c:590)
    <Greenlet at 0x7fdd593c94b0: _handle_and_close_when_done(<bound method WSGInd method WSGIServer.do_close of <WSGIServer a, (<socket at 0x7fdd590f4410 SSLEOFError
  

В моей системе также есть OpenSSL версии 1.0.2.j, если это поможет. Любые мысли будут оценены!

Комментарии:

1. Об этом мне сообщали раньше (см. github.com/miguelgrinberg/Flask-SocketIO/issues/88 ), но так и не нашел, в чем была проблема. Вполне возможно, что это ошибка, связанная с gevent. Возможно, вы сможете обойти это, если у вас есть прокси-сервер, который вы можете настроить для прекращения действия вашего SSL, как это сделал человек из сообщения об ошибке, на которое я ссылался.

Ответ №1:

Используйте patch_all поверх кода. Даже до импорта flask и socketio.

 from gevent import monkey
monkey.patch_all()

from flask import Flask
from flask_socketio import SocketIO

import ssl
  

Комментарии:

1. Похоже, это не помогает.