2011-05-13 45 views
16

Quiero publicar una transmisión en tiempo real que debe estar encriptada de forma segura debido a datos confidenciales.¿Cómo puedo implementar un servidor WebSocket seguro (wss: //) en Python?

Tengo éxito WebSockets normales en streaming usando tanto GEvent y gunicorn interfaces tan directos, pero ahora tengo que hacer que sea seguro, y estoy buscando cualquiera de éstos:

  1. un servidor que puede servir segura Las conexiones WebSocket que están conectadas a (por ejemplo) gunicorn que escucha conexiones WebSocket no seguras.
  2. Un marco que puede servir conexiones de WebSocket seguras directamente. He estado mirando a Tornado y creo que puede manejarlo, pero todavía estoy abierto a sugerencias.
  3. Uso ZeroMQ para el patrón PUB/SUB. Si hay una buena implementación del protocolo WebSocket para ZeroMQ, sería genial.

La velocidad no es muy importante aquí ya que el número de conexiones será bajo. Sin embargo, la integridad de los datos es importante.

Respuesta

2

Eche un vistazo al standalone websockets server del proyecto pywebsocket compatible con Google.

Tenga en cuenta que este módulo de Python usa CGIHTTPServer, por lo que debe ajustarlo para que sea seguro. Tenía un requisito similar para un proyecto en el que estuve involucrado hace algunos meses, así que bifurqué el módulo standalone.py y eliminé las dependencias con material CGI, pero no he probado mucho las conexiones seguras.

Quizás pueda importar OpenSSL.SSL y configurar un WebSocketServer como está en mi script. Debería usar un WebSocketRequestHandler con la configuración adecuada de use_tls, private_key y certificate para implementar TLS (Transport Layer Security).

Lea el código fuente. Creo que puede ampliarlo para satisfacer sus necesidades.

+0

+1 porque esta implementación es muy liviana (un pequeño archivo de módulo de python, sin dependencias) y admite ws y wss de fábrica. –

5

Puede consultar el proyecto websockify. Websockify es un proxy que permite que un navegador con capacidad WebSockets se comunique con un servidor TCP binario en bruto. Lo hace mediante base64 codificando todo el tráfico hacia/desde el navegador. Sin embargo, el proyecto es modular y el archivo websocket.py es un servidor WebSocket general que está diseñado para ser extendido (y hay un par de pruebas incluidas que muestran cómo funciona esto). Sería bastante fácil desactivar la codificación base64 si eso no es necesario para su proyecto.

Websockify también incluye una biblioteca de Javascript 'websock.js' que está diseñada para interactuar con websockify. Se recurrirá de forma transparente al uso de web-socket-js (basado en Flash) si el navegador no tiene soporte nativo de WebSocket.

Websockify admite conexiones seguras (TLS/wss) y también es capaz de responder solicitudes de políticas de seguridad de Flash en línea en el mismo puerto.

Descargo de responsabilidad: Realicé websockify.

3

Usamos Tornado y Tornadio para nuestra aplicación en tiempo real, y acabo de activar SSL para websockets, así como todos los demás protocolos en tiempo real socket.io. ¡Me llevó algo más de una hora!más información aquí:

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

+1

El enlace está roto. –

7

Asumiendo que usted tiene su aplicación funcionando correctamente sobre los no SSL Tornado WebSockets, cambiar la escuche llamada desde:

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

a:

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

donde "mydomain.crt" y "mydomain.key" son sus archivos de certificado SSL habituales, y lib_dir es el directorio en el que viven.

No se olvide de cambiar el cliente para utilizar "WSS:"

También tenga en cuenta que el puerto se especifica en la convocatoria escuchar todavía serán utilizadas si se especifica ssl_options. es decir, no volverá a escuchar en el puerto 443.

1

En el lado del servidor añadir esto a Tornado:

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

En el lado del cliente, consulte este enlace: wss://www.example.com:2201/ws, donde el 2201 es el seguro TLS de WebSocket Puerto.

Cuestiones relacionadas