2011-07-06 31 views
123

Estoy tratando de ejecutar socket.io con mi certificado SSL, sin embargo, no se conectará.node.js, socket.io con SSL

basé mi código fuera el ejemplo de chat:

var https = require('https'); 
var fs = require('fs'); 
/** 
* Bootstrap app. 
*/ 
var sys = require('sys') 
require.paths.unshift(__dirname + '/../../lib/'); 

/** 
* Module dependencies. 
*/ 

var express = require('express') 
    , stylus = require('stylus') 
    , nib = require('nib') 
    , sio = require('socket.io'); 

/** 
* App. 
*/ 
var privateKey = fs.readFileSync('../key').toString(); 
var certificate = fs.readFileSync('../crt').toString(); 
var ca = fs.readFileSync('../intermediate.crt').toString(); 

var app = express.createServer({key:privateKey,cert:certificate,ca:ca }); 


/** 
* App configuration. 
*/ 

... 

/** 
* App routes. 
*/ 

app.get('/', function (req, res) { 
    res.render('index', { layout: false }); 
}); 

/** 
* App listen. 
*/ 

app.listen(443, function() { 
    var addr = app.address(); 
    console.log(' app listening on http://' + addr.address + ':' + addr.port); 
}); 

/** 
* Socket.IO server (single process only) 
*/ 

var io = sio.listen(app,{key:privateKey,cert:certificate,ca:ca}); 
... 

Si quito el código SSL funciona muy bien, sin embargo con ello consigo una petición a http://domain.com/socket.io/1/?t=1309967919512

nota que no está tratando de https, lo cual hace que falle

Estoy probando en chrome, ya que es el navegador de destino para esta aplicación.

Disculpe si esta es una pregunta simple, soy un nodo/socket.io newbie.

Gracias!

+0

Está intentando su cliente conectarse a un URI con el prefijo 'wss: //'. – kanaka

+0

no, no llega, hace que la solicitud a http://domain.com/socket.io/1/?t=1309967919512 muera. – Beyond

+0

¿Cómo está especificando la dirección para conectarse? "domain.com" suena como un marcador de posición en la biblioteca del lado del cliente de socket.io. ¿Puedes publicar el código de JavaScript de tu cliente que estás utilizando para conectarte? – kanaka

Respuesta

150

Use una URL segura para su conexión inicial, es decir, en lugar de "http: //" use "https: //". Si se elige el transporte WebSocket, entonces Socket.IO debería usar automáticamente "wss: //" (SSL) para la conexión WebSocket también.

actualización:

También puede intentar crear la conexión utilizando la opción 'seguro':

var socket = io.connect('https://localhost', {secure: true}); 
+0

hacemos esto. pasamos a https: // www.thebitcoinwheel.com y todavía hace una solicitud a http automáticamente, esto es algo con el código socket.io y es el punto de la pregunta. – Beyond

+8

seguro: cierto lo hizo, gracias kanaka! – Beyond

+1

¡Ustedes me salvó la vida! No pude encontrar esas opciones en la documentación. –

25

En la misma nota, si el servidor soporta tanto http y https puede conectarse a través de :

var socket = io.connect('//localhost'); 

a auto detect the browser scheme y conectarse usando htt p/https en consecuencia. cuando en https, el transporte será asegurado de forma predeterminada, como la conexión usando

var socket = io.connect('https://localhost'); 

utilizará sockets web seguras - wss:// (la {secure: true} es redundante).

para obtener más información sobre cómo servir http y https fácilmente utilizando el mismo servidor de nodo echa un vistazo this answer.

23

Así es como me las arreglé para configurarlo con expreso:

var fs = require('fs'); 
var app = require('express')(); 
var https  = require('https'); 
var server = https.createServer({ 
    key: fs.readFileSync('./test_key.key'), 
    cert: fs.readFileSync('./test_cert.crt'), 
    ca: fs.readFileSync('./test_ca.crt'), 
    requestCert: false, 
    rejectUnauthorized: false 
},app); 
server.listen(8080); 

var io = require('socket.io').listen(server); 

io.sockets.on('connection',function (socket) { 
    ... 
}); 

app.get("/", function(request, response){ 
    ... 
}) 


espero que esto ahorrará tiempo de alguien.

Actualización: para aquellos que utilizan permite el uso cifrar este

var server = https.createServer({ 
       key: fs.readFileSync('privkey.pem'), 
       cert: fs.readFileSync('fullchain.pem') 
      },app); 
+1

Esta es la única solución que funcionó para mí. Gracias por ahorrar mi tiempo. –

+0

funcionaba bien para mí después de un poco de ensayo y error con los certs – RozzA

+0

esta es una buena solución para mí –

4

archivo Si el servidor de certificado no es de confianza, (por ejemplo, puede generar el almacén de claves por sí mismo con herramienta de claves de comandos en Java) , debe agregar la opción adicional de rechazoUnaautorizada

var socket = io.connect('https://localhost', {rejectUnauthorized: false}); 
4

compruebe esto.configuración ..

app = module.exports = express(); 
var httpsOptions = { key: fs.readFileSync('certificates/server.key'), cert: fs.readFileSync('certificates/final.crt') };   
var secureServer = require('https').createServer(httpsOptions, app); 
io = module.exports = require('socket.io').listen(secureServer,{pingTimeout: 7000, pingInterval: 10000}); 
io.set("transports", ["xhr-polling","websocket","polling", "htmlfile"]); 
secureServer.listen(3000); 
Cuestiones relacionadas