2011-05-13 13 views
16

Hassas veriler nedeniyle güvenli bir şekilde şifrelenmesi gereken gerçek zamanlı bir akış sunmak istiyorum.Python'da güvenli bir WebSocket (wss: //) sunucusunu nasıl uygularım?

başarıyla direkt frontends hem gevent kullanarak ve gunicorn akışı normale Yuvalarının var ama şimdi bunun güvenli hale getirmek gerekir ve bu her iki arıyorum:

  1. Bir sunucu güvenli sunabileceğini Güvenli olmayan WebSocket bağlantılarını dinleyen (örneğin) tabancaya provoke edilen WebSocket bağlantıları.
  2. Doğrudan güvenli WebSocket bağlantılarına hizmet edebilen bir çerçeve. Tornado'ya baktım ve bunun halledebileceğine inanıyorum ama hala önerilere açığım.
  3. PUB/SUB deseni için ZeroMQ kullanıyorum. ZeroMQ için iyi bir WebSocket protokolü uygulaması varsa, bu harika olurdu.

Bağlantı sayısı düşük olacağı için hız burada çok önemli değil. Bununla birlikte, verilerin bütünlüğü önemlidir.

cevap

2

Google tarafından desteklenen pywebsocket projesinin standalone websockets server numaralı projesine bakın.

Bu Python modülünün CGIHTTPServer kullandığını ve bu nedenle güvenliğini sağlamak için ince ayar yapmanız gerektiğini unutmayın. Bazı aylar önce dahil olduğum bir proje için benzer bir gereksinim vardı, bu yüzden standalone.py modülünü çatallıyorum ve bağımlılıkları CGI parçalarıyla kaldırdım ancak güvenli bağlantıları çok fazla test etmedim.

Belki de, 'u içe aktarıp, benim komut dosyasına olduğu gibi bir WebSocketServer kurabilirsiniz. TLS (Aktarım Katmanı Güvenliği) uygulamak için , private_key ve certificate doğru yapılandırmasıyla WebSocketRequestHandler kullanılmalıdır.

Kaynak kodunu okuyun. Bence ihtiyaçlarınızı karşılamak için genişletebilirsiniz.

+0

+1 Bu uygulama çok hafif olduğundan (küçük bir python modül dosyası, bağımlılık yok) ve hem ws hem de wss'i kutudan çıkarır. –

5

websockify projesine göz atabilirsiniz. Websockify, bir WebSockets özellikli tarayıcının ham bir ikili TCP sunucusuyla iletişim kurmasını sağlayan bir proxy'dir. Bunu, tarayıcıya gelen/giden tüm trafiği kodlayan base64 ile yapar. Ancak, proje modülerdir ve websocket.py dosyası genişletilecek şekilde tasarlanmış genel bir WebSocket sunucusudur (ve bunun nasıl çalıştığını gösteren birkaç test bulunmaktadır). Projeniz için gerekli değilse, base64 kodlamasını devre dışı bırakmak oldukça kolay olacaktır.

Websockify ayrıca websockify ile etkileşime geçmek üzere tasarlanmış bir 'websock.js' Javascript kitaplığı içerir. Tarayıcı yerel WebSocket desteğine sahip değilse, web-socket-js (Flash tabanlı) kullanmaya şeffaf bir şekilde geri dönecektir.

Websockify, güvenli (TLS/wss) bağlantılarını destekler ve aynı zamanda Flash güvenlik ilkesi isteklerini aynı bağlantı noktasında satır içi olarak yanıtlayabilir.

Yasal Uyarı: Websockify yaptım.

3

Gerçek zamanlı uygulamamız için Tornado ve Tornadio kullanıyoruz ve diğer tüm gerçek zamanlı socket.io protokollerinin yanı sıra web bağlantıları için SSL'yi açtım. Beni bir saatten fazla sürdü!burada daha fazla bilgi:

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

için:

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"), 
    }) 

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

+1

Bağlantı bozuk. –

7

uygulamanızın SSL olmayan Tornado WebSockets üzerinde düzgün çalışmakta olduğundan, gelen çağrı dinle değiştirmek varsayarsak "mydomain.crt" ve "mydomain.key" her zamanki SSL sertifikası dosyalarınızdır ve lib_dir içinde yaşadıkları dizindir.

"wss:" kullanmaya müşteri değiştirmek unutmayın

Ayrıca liman size ssl_options belirtirseniz kullanılmaya devam edecek dinlemek çağrısında belirtmek unutmayın. yani sunucu tarafında 443 numaralı bağlantı noktası

1

dinleme dönmek olmaz Tornado bu ekleyin:

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

istemci tarafında bu linke bakın: wss://www.example.com:2201/ws, 2201 güvenli WebSocket'e TLS olduğunu Liman.

İlgili konular