2015-01-12 82 views
2

我試圖運行一個簡單的啓用SSL的應用程序使用gevent.pywsgiWSGIServer。不過,我一直在第一次請求後約10-15秒時(從Chrome中)作出後得到SSLError: [Errno 8] _ssl.c:510: EOF occurred in violation of protocol,在我的假設是試圖重新握手:gevent和SSL導致「EOF發生違反協議」

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版本,在衆多其他線程,其中大部分引用this answer建議。這可以在MWE中看到。
  2. 我已驗證使用Flask的默認設置內置服務器獲得沒有錯誤,SSL設置的方式類似於this snippet
  3. 研究來源。最終,在do_handshake()中處理了幾個SSL_ERROR_WANT_READ「例外」後,異常來自封裝的C函數。

我現在在Windows機器上使用gevent==1.0.1Python 2.7.8 (default, Jun 30 2014, 16:03:49)

我該如何擺脫那個錯誤?

+0

您是否嘗試過這個答案的http:// stackoverflow.com/a/24166498/41957? – chnrxn

+0

你有沒有找到解決方案? – webjunkie

+0

@webjunkie不,我最終使用Nginx作爲SSL的代理,請參閱https://github.com/miguelgrinberg/Flask-SocketIO/issues/88。我不認爲你會在上述問題上得到很多幫助,每個人似乎都推遲與代理處理SSL,所以他們不必在他們的應用中處理它。 –

回答

0

確保您指定完整路徑您的文件server.key和server.crt。

而且,使得HTTP請求到服務器時,不要忘記指定「HTTPS」在https://127.0.0.1:12344/

相關問題