如何在 Python 中实现安全的 WebSocket (wss://) 服务器



我想提供一个由于敏感数据而必须安全加密的实时流。

我已经成功地使用 gevent 和 gunicorn 作为直接前端获得了正常的 WebSockets 流,但现在我需要让它安全,并且正在寻找以下任何一个:

  1. 可以提供安全 WebSocket 连接的服务器,这些连接代理到(例如)侦听非安全 WebSocket 连接的 gunicorn。
  2. 可以直接提供安全 WebSocket 连接的框架。我一直在研究龙卷风,相信它可以处理它,但我仍然愿意接受建议。
  3. 我使用 ZeroMQ 作为 PUB/SUB 模式。如果有一个好的 ZeroMQ WebSocket 协议实现,那就太好了。

速度在这里不是特别重要,因为连接数量会很低。但是,数据的完整性很重要。

假设您的应用程序在非 SSL Tornado WebSockets 上正常运行,请将侦听调用从:

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,则仍将使用您在侦听调用中指定的端口。 即它不会恢复为侦听端口 443。

你可以看看websockify项目。Websockify是一个代理,它允许支持WebSockets的浏览器与原始二进制TCP服务器进行通信。它通过 base64 编码进出浏览器的所有流量来实现这一点。但是,该项目是模块化的,websocket.py 文件是设计用于扩展的通用 WebSocket 服务器(并且有几个包含的测试显示了它是如何工作的)。如果您的项目不需要禁用 base64 编码,这将相当容易。

Websockify还包括一个Javascript库"websock.js",旨在与websockify进行交互。如果浏览器没有本机 WebSocket 支持,它将透明地回退到 使用web-socket-js(基于 Flash)。

Websockify支持安全(TLS/wss)连接,并且还能够在同一端口上内联响应Flash安全策略请求。

免责声明:我做了网络。

看看 Google 支持的 pywebsocket 项目的独立 websockets 服务器。

请注意,此 Python 模块使用CGIHTTPServer因此您需要对其进行调整以使其安全。几个月前,我对我参与的一个项目也有类似的要求,所以我分叉了 standalone.py 模块并删除了对CGI内容的依赖,但我还没有测试太多安全连接。

也许您可以导入OpenSSL.SSL并设置我的脚本中的WebSocketServer。它应该使用具有正确配置use_tlsprivate_keycertificateWebSocketRequestHandler,以实现TLS(传输层安全性)。

阅读源代码。我认为您可以扩展它以满足您的需求。

我们将 Tornado 和 Tornadio 用于我们的实时应用程序,我刚刚为 websockets 打开了 SSL 以及所有其他实时socket.io协议。 我只用了一个多小时! 更多信息在这里:

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

在服务器端将其添加到 Tornado:

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

在客户端,请参阅此链接: wss://www.example.com:2201/ws,其中 2201 是安全 Websocket 的 TLS 端口。

相关内容

  • 没有找到相关文章

最新更新