我想提供一个由于敏感数据而必须安全加密的实时流。
我已经成功地使用 gevent 和 gunicorn 作为直接前端获得了正常的 WebSockets 流,但现在我需要让它安全,并且正在寻找以下任何一个:
- 可以提供安全 WebSocket 连接的服务器,这些连接代理到(例如)侦听非安全 WebSocket 连接的 gunicorn。
- 可以直接提供安全 WebSocket 连接的框架。我一直在研究龙卷风,相信它可以处理它,但我仍然愿意接受建议。
- 我使用 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_tls
、private_key
和certificate
的WebSocketRequestHandler
,以实现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 端口。