2011-03-15 43 views
23

Quiero usar websockets seguros para mejorar la tasa de éxito. No necesito el cifrado.Websockets seguros con certificado autofirmado

¿Tengo que ver una advertencia cuando use Websockets seguros (wss: //example.com) con un certificado autofirmado? Lo probé con Chrome 10 y no veo una advertencia y no me pide que acepte el certificado. Simplemente funciona.

¿Esto es un error en Chrome o el comportamiento esperado? ¿Podré usar certificados autofirmados en el futuro?

Gracias

Respuesta

14

Sí, ese es el comportamiento actual de Chrome, pero no se puede esperar que continúe siendo la política en el futuro. En Firefox 4 (si habilita WebSockets en about: config) recibirá una advertencia sobre el certificado. Para aprobar el certificado también puede tener que ingresar la URL de WebSockets en el navegador (sustituir wss por https) y aprobarla allí primero (ya que la advertencia de la conexión WebSockets sobre el certificado autofirmado puede no darle la oportunidad de aprobarlo)

Espero que todos los navegadores converjan en el comportamiento correcto que es lanzar un cuadro de diálogo de advertencia que permite la aprobación del certificado autofirmado.

+0

¿Sabe si el próximo proyecto websockets mejora la tasa de éxito de WebSockets no seguros? – pablo

+0

Probablemente no. Los principales cambios se refieren al encuadre de los datos (basado en la longitud en lugar de en el delimitador) y los datos del cliente al servidor no están enmascarados para abordar el problema intermedio que funciona mal. Los puertos 80 y 443 siguen siendo los puertos estándar de WebSockets y el saludo de manos sigue siendo similar a HTTP. ¿Cuál es el problema que está viendo al hacer que WebSockets no se conecte por usted? – kanaka

+2

Me refiero a http://www.ietf.org/mail-archive/web/hybi/current/msg01605.html. Dice que el puerto 80 tiene solo una tasa de éxito del 63%, mientras que el puerto 443 tiene una tasa de éxito del 95%. También estoy obligado a usar el puerto 443 o 8080 porque estoy usando nginx como proxy y no es compatible con HTTP 1.1. El puerto 443 requiere un certificado que complica las cosas y tal vez un poco por encima. No estoy seguro de cuántos usuarios tienen bloqueado el puerto 8080. – pablo

11

Certificados autofirmados son rechazados por Chrome desde v19 (http://crbug.com/53836). Si intenta conectarse a una URL de wss que utiliza un certificado autofirmado, entonces la solicitud se cancela de manera silenciosa.
Para permitir certificados con firma a utilizar, iniciar Chrome con el --ignore-certificate-errors bandera, e, g:

chromium --user-data-dir=/tmp/whatever --ignore-certificate-errors 

Que yo sepa, no hay manera de conseguir Firefox para aceptar su certificado autofirmado para WSS . Entonces, solo usa ws:// para probar en Firefox. Si está probando su aplicación web a través de HTTPS, entonces usted tiene que cambiar una preferencia para permitir conexiones a (inseguro) ws:// URL:

  1. Visita about:config
  2. Conjunto network.websocket.allowInsecureFromHTTPS a true
+8

Un truco que puede usar es acceder a una URL HTTPS en la misma dirección/puerto que su punto final websocket con el certificado autofirmado y cuando arroja un cuadro, puede agregar una excepción de seguridad. Esta excepción continuará trabajando para las conexiones WebSocket también. Muchas implementaciones de WebSocket también pueden servir a una página HTTPS. De lo contrario, poner de pie un servidor HTTPS rápido a través de apache o 'openssl s_server' solo para agregar la excepción de seguridad también funciona. Esto funciona en todos los principales navegadores, incluido Firefox. – zaphoyd

+0

¡Me salvaste el día, gracias! –

7

I tengo trabajo siguiendo este:

https://github.com/einaros/ws/blob/master/test/WebSocketServer.test.js#L514

Fi en primer lugar generar sus certs de firma propia:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 100 -nodes 

Entonces cree su httpsServer de una aplicación expresa usando el nodo integrado en HTTPS:

var privateKey = fs.readFileSync('sslcert/key.pem', 'utf8'); 
var certificate = fs.readFileSync('sslcert/cert.pem', 'utf8'); 

var credentials = {key: privateKey, cert: certificate}; 
var express = require('express'); 
var app = express(); 

//... bunch of other express stuff here ... 

//pass in your express app and credentials to create an https server 
var httpsServer = https.createServer(credentials, app); 
httpsServer.listen(8443); 

A continuación, la configuración de su servidor de WebSocket (irónicamente esto va a usar el mismo puerto como el servidor http, no sabía esto pero supongo que los protocolos pueden compartir puertos? - esto me tuvo por un tiempo).

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ 
    server: httpsServer 
    }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 
    }); 

    ws.send('something'); 
}); 

ahora Navegar a https://0.0.0.0:8443 servidor y aceptar el certificado autofirmado en Chrome. Entonces websockets ahora debería funcionar isnide el navegador.

Abra una consola de cromo y devtools Tipo:

var ws = new WebSocket('wss://0.0.0.0:8443'); 
ws.send('foo'); 

.... o lo que sea anfitrión: puerto que se utilizó para httpsServer, la clave aquí es que está utilizando el protocolo wss://

En el nodo express web server debería ver un mensaje registrado en la consola. Iniciar el servidor con node ./server.js

http://www.chovy.com/web-development/self-signed-certs-with-secure-websockets-in-node-js/

+0

Esto funciona, me faltaba esta parte "Ahora navegue al servidor https://0.0.0.0:8443 y acepte el certificado autofirmado en Chrome". – xliiv

Cuestiones relacionadas