これは私が持っている問題を一貫して繰り返す簡単なコードスニペットです。私はPython 2.7.12、Flask 0.11、Flask-SocketIO 2.7.1、およびgevent 1.1.2を使用しています。私はこれがおそらく責任パッケージのメーリングリストに持ち込まれた問題だと理解していますが、どちらが責任あるのか分かりません。しかし、私はそれが例外を発生させる理由で、geventの問題であると確信しています。Flask + SocketIO + GeventでSSL EOFエラーが発生するのはなぜですか?
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を持っています。どんな考えにも感謝します!
これは以前私に報告されていましたが(https://github.com/miguelgrinberg/Flask-SocketIO/issues/88を参照)、問題は何も見つかりませんでした。これはgevent関連のバグである可能性が非常に高いです。バグの人が私がリンクしたと報告したので、SSLを終了するように設定できるプロキシサーバーがあれば、これをバイパスできます。 – Miguel