node.js, socket.io com SSL

Eu estou tentando obter o socket.io em execução com o meu certificado SSL no entanto, ele não irá se conectar.

Eu baseei meu código no exemplo de bate-papo:

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}); ... 

Se eu remover o código SSL, ele funcionará bem, mas com ele eu recebo uma solicitação para http://domain.com/socket.io/1/?t=1309967919512

Note que não está tentando https, o que faz com que ele falhe.

Estou testando no chrome, pois é o navegador de destino para este aplicativo.

Peço desculpas se esta é uma pergunta simples, eu sou um novato node / socket.io.

Obrigado!

Use um URL seguro para sua conexão inicial, ou seja, em vez de “http: //”, use “https: //”. Se o transporte WebSocket for escolhido, o Socket.IO deverá usar automaticamente “wss: //” (SSL) para a conexão WebSocket também.

Atualização :

Você também pode tentar criar a conexão usando a opção ‘secure’:

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

Foi assim que consegui configurá-lo com 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 isso salve o tempo de alguém.

Atualização: para aqueles que usam permite criptografar usar este

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

Na mesma nota, se o seu servidor suportar http e https você poderá se conectar usando:

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

para detectar automaticamente o esquema do navegador e conectar-se usando http / https de acordo. quando em https, o transporte será protegido por padrão, como conectando usando

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

usará sockets da web seguros – wss:// (o {secure: true} é redundante).

Para obter mais informações sobre como servir tanto http como https facilmente usando o mesmo servidor de nó, verifique esta resposta .

Se o seu arquivo certificado pelo servidor não for confiável (por exemplo, você pode gerar o keystore sozinho com o comando keytool em java), você deve adicionar a opção extra rejectUnauthorized

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

confira this.configuration ..

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