2011-05-13 703 views
16

我想为需要安全加密的实时流提供敏感数据。如何在Python中实现安全的WebSocket(wss://)服务器?

我已经成功地得到了正常的WebSockets同时使用GEVENT和gunicorn直接前端流媒体,但现在我需要,以确保安全,并正在寻找任一:

  1. 一台服务器可以充当安全WebSocket连接代理(例如)监听非安全WebSocket连接的gunicorn。
  2. 一个可以直接提供安全WebSocket连接的框架。我一直在看龙卷风,并相信它可以处理它,但我仍然乐于接受建议。
  3. 我使用ZeroMQ作为PUB/SUB模式。如果ZeroMQ有一个好的WebSocket协议实现,那会很好。

由于连接数量很少,速度并不是特别重要。但是,数据的完整性很重要。

回答

2

查看Google支持的pywebsocket项目的standalone websockets server

请注意,此Python模块使用CGIHTTPServer,因此您需要调整它以确保安全。我对几个月前涉及的一个项目有类似的要求,所以我分叉了standalone.py模块并删除了CGI的依赖关系,但我没有非常严格地测试安全连接。

也许你可以导入OpenSSL.SSL并设置一个WebSocketServer,因为它在我的脚本中。它应该使用WebSocketRequestHandler,正确配置为use_tls,private_keycertificate以实现TLS(传输层安全性)。

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

+0

+1因为这个实现是非常轻量级的(一个小型​​的python模块文件,没有依赖关系)并且支持ws和wss。 – 2014-01-28 18:46:19

5

您可以查看websockify项目。 Websockify是一个代理,它允许具有WebSocket功能的浏览器与原始二进制TCP服务器进行通信。它通过base64编码来自/来自浏览器的所有流量。然而,这个项目是模块化的,websocket.py文件是一个通用的WebSocket服务器,它被设计用来扩展(并且有几个包含的测试来显示它是如何工作的)。如果你的项目不需要,那么禁用base64编码将会非常容易。

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

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

声明:我做了websockify。

3

我们使用Tornado和Tornadio作为我们的实时应用程序,并且我只是打开了SSL for websockets,以及所有其他实时协议。我花了一个多小时!更多资讯:

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

+1

链接已损坏。 – 2014-03-21 20:34:52

7

假设你有你的应用程序在非SSL龙卷风的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

1

在服务器端将它添加到龙卷风:

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

在客户端,请参考以下链接: wss://www.example.com:2201/ws,其中2201是安全的WebSocket的TLS港口。

相关问题