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

如何在Python中实现安全的WebSocket(wss://)服务器?,python,websocket,Python,Websocket,我想提供一个实时流,由于敏感数据,该流必须安全加密 我已经成功地使用gevent和gunicorn作为直接前端实现了正常的WebSocket流媒体,但现在我需要确保它的安全性,我正在寻找以下两种方法之一: 可以为代理(例如)gunicorn的安全WebSocket连接提供服务的服务器,gunicorn侦听非安全WebSocket连接 可以直接为安全WebSocket连接提供服务的框架。我一直在关注龙卷风,相信它能应对,但我仍然愿意接受建议 我使用ZeroMQ作为发布/订阅模式。如果ZeroMQ有

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

我已经成功地使用gevent和gunicorn作为直接前端实现了正常的WebSocket流媒体,但现在我需要确保它的安全性,我正在寻找以下两种方法之一:

  • 可以为代理(例如)gunicorn的安全WebSocket连接提供服务的服务器,gunicorn侦听非安全WebSocket连接
  • 可以直接为安全WebSocket连接提供服务的框架。我一直在关注龙卷风,相信它能应对,但我仍然愿意接受建议
  • 我使用ZeroMQ作为发布/订阅模式。如果ZeroMQ有一个好的WebSocket协议实现,那就太好了
  • 速度在这里不是特别重要,因为连接的数量将很低。然而,数据的完整性是很重要的。

    看看谷歌支持的项目的详细情况

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

    也许您可以导入
    OpenSSL.SSL
    ,并像在我的脚本中一样设置
    WebSocketServer
    。它应该使用
    WebSocketRequestHandler
    以及
    私钥
    证书
    的正确配置,以实现tls(传输层安全性)

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

    您可以查看该项目。Websockify是一个代理,允许支持WebSockets的浏览器与原始二进制TCP服务器通信。它通过base64编码所有进出浏览器的流量来实现这一点。然而,该项目是模块化的,websocket.py文件是一个通用的websocket服务器,它被设计为可扩展的(还有一些附带的测试,展示了它是如何工作的)。如果您的项目不需要base64编码,那么禁用base64编码将相当容易

    Websockify还包括一个Javascript库“websock.js”,该库设计用于与Websockify交互。如果浏览器没有本机WebSocket支持,它将透明地退回到使用(基于Flash)

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


    免责声明:我制作了websockify。

    我们的实时应用程序使用Tornado和Tornadio,我刚刚为WebSocket以及所有其他实时
    socket.io
    协议打开了SSL。我只花了一个多小时!更多信息请点击此处:


    假设您的应用程序在非SSL Tornado WebSockets上正常运行,请将侦听呼叫更改为:

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

    其中“mydomain.crt”和“mydomain.key”是您常用的SSL证书文件,lib_dir是它们所在的目录

    不要忘记将客户端更改为使用“wss:”


    还请注意,如果指定ssl\U选项,则仍将使用在侦听调用中指定的端口。i、 e.它不会恢复到在端口443上侦听。

    在服务器端,将此添加到Tornado:

    tornadio2.server.SocketServer(application, ssl_options={
        "certfile": "server.crt",
        "keyfile":  "server.key",
    })
    
    在客户端,请参阅此链接:
    wss://www.example.com:2201/ws
    ,其中2201是安全Websocket的TLS端口。

    +1因为此实现非常轻量级(一个小型python模块文件,没有依赖项),并且支持ws和wss开箱即用。
    tornadio2.server.SocketServer(application, ssl_options={
        "certfile": "server.crt",
        "keyfile":  "server.key",
    })