簡體   English   中英

如何在Python中實現安全的WebSocket(wss://)服務器?

[英]How can I implement a secure WebSocket (wss://) server in Python?

我想提供由於敏感數據而必須安全加密的實時流。

我已成功使用gevent和gunicorn作為直接前端獲得正常的WebSockets流,但現在我需要使其安全,並且我正在尋找以下任何一種:

  1. 一個服務器,可以提供安全的WebSocket連接,代理(例如)gunicorn,用於偵聽非安全的WebSocket連接。
  2. 一個可以直接提供安全WebSocket連接的框架。 我一直在關注龍卷風並相信它可以處理它,但我仍然願意接受建議。
  3. 我使用ZeroMQ作為PUB / SUB模式。 如果ZeroMQ有一個很好的WebSocket協議實現,那就太好了。

速度在這里並不重要,因為連接數量很少。 但是,數據的完整性很重要。

假設您的應用程序在非SSL Tornado WebSockets上正常運行,請更改listen調用:

app.listen(args.listen_port, args.listen_interface) 

至:

app.listen(args.listen_port, args.listen_interface, ssl_options={ 
        "certfile": os.path.join(lib_dir, "mydomain.crt"),
        "keyfile": os.path.join(lib_dir, "mydomain.key"),
    })

其中“mydomain.crt”和“mydomain.key”是您通常的SSL證書文件,lib_dir是它們所在的目錄。

不要忘記更改客戶端以使用“wss:”

另請注意,如果指定ssl_options,仍將使用您在listen調用中指定的端口。 即它不會恢復到偵聽端口443。

您可以查看websockify項目。 Websockify是一個代理,允許支持WebSockets的瀏覽器與原始二進制TCP服務器通信。 它通過base64編碼進出瀏覽器的所有流量來完成此操作。 但是,該項目是模塊化的,websocket.py文件是一個通用的WebSocket服務器,旨在擴展(還有一些包含的測試,顯示它是如何工作的)。 如果您的項目不需要,那么禁用base64編碼會相當容易。

Websockify還包括一個Javascript庫'websock.js',旨在與websockify進行交互。 如果瀏覽器沒有本機WebSocket支持,它將透明地回退到使用web-socket-js (基於Flash)。

Websockify支持安全(TLS / wss)連接,並且還能夠在同一端口上內聯回答Flash安全策略請求。

免責聲明:我做了websockify。

我們使用Tornado和Tornadio作為我們的實時應用程序,我剛剛開啟了SSL for websockets,以及所有其他實時socket.io協議。 我花了一個多小時! 更多信息:

http://devblog.resolversystems.com/?p=1084

看一下Google支持的pywebsocket項目的獨立websockets服務器

請注意,此Python模塊使用CGIHTTPServer因此您需要對其進行調整以確保其安全。 我對幾個月前參與的項目有類似的要求,所以我分叉了standalone.py模塊並用CGI刪除了依賴項,但我還沒有測試過很多安全連接。

也許你可以導入OpenSSL.SSL並在我的腳本中設置一個WebSocketServer 它應該使用具有use_tlsprivate_keycertificate的正確配置的WebSocketRequestHandler來實現TLS(傳輸層安全性)。

閱讀源代碼。 我認為你可以擴展它以滿足你的需求。

在服務器端將此添加到Tornado:

tornadio2.server.SocketServer(application, ssl_options={
    "certfile": "server.crt",
    "keyfile":  "server.key",
})

在客戶端,請參考以下鏈接: wss://www.example.com:2201/ws ,其中2201是安全的Websocket的TLS端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM