【问题标题】:How can I implement a secure WebSocket (wss://) server in Python?如何在 Python 中实现安全的 WebSocket (wss://) 服务器?
【发布时间】:2011-08-25 01:43:28
【问题描述】:

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

我已经使用 gevent 和 gunicorn 作为直接前端成功地获得了正常的 WebSockets 流,但现在我需要确保它的安全性,并且正在寻找其中之一:

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

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

【问题讨论】:

    标签: python websocket


    【解决方案1】:

    看看谷歌支持的pywebsocket项目的standalone websockets server

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

    也许您可以导入OpenSSL.SSL 并设置一个WebSocketServer,就像在我的脚本中一样。它应该使用WebSocketRequestHandleruse_tlsprivate_keycertificate 的正确配置,以实现TLS(传输层安全)。

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

    【讨论】:

    • +1 因为这个实现非常轻量级(一个小的 python 模块文件,没有依赖项),并且开箱即用地支持 ws 和 wss。
    【解决方案2】:

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

    Websockify 还包括一个 Javascript 库“websock.js”,旨在与 websockify 交互。如果浏览器不支持原生 WebSocket,它将透明地回退到使用 web-socket-js(基于 Flash)。

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

    免责声明:我制作了 websockify。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        假设您的应用在非 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。

        【讨论】:

          【解决方案5】:

          在服务器端将这个添加到 Tornado:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-08-03
            • 2020-08-16
            • 1970-01-01
            • 1970-01-01
            • 2017-09-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多