ssl node.js https websocket socket.io

node.js, socket.io con SSL



https websocket (5)

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

Basé mi código en 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 elimino el código SSL funciona bien, sin embargo, con él recibo una solicitud para http://domain.com/socket.io/1/?t=1309967919512

Tenga en cuenta que no está intentando https, lo que hace que falle.

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

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

¡Gracias!


Así es como logré configurarlo con express:

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 ahorre tiempo a alguien.

Actualización: para aquellos que usan el encriptar, usa esto

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


En la misma nota, si su servidor admite http y https , puede conectarse utilizando:

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

para detectar automáticamente el esquema del navegador y conectarse utilizando http / https en consecuencia. cuando esté en https, el transporte estará protegido de manera predeterminada, ya que se conecta utilizando

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

usará sockets web seguros - wss:// (el {secure: true} es redundante).

para obtener más información sobre cómo servir tanto http como https fácilmente usando el mismo servidor de nodo, revise esta respuesta .


Si el archivo certificado de su servidor no es confiable, (por ejemplo, puede generar el almacén de claves usted mismo con el comando keytool en java), debe agregar la opción adicional de rechazoUnaautorizada

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


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 puedes intentar crear la conexión usando la opción ''segura'':

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


revisa 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);