Estou tentando fazer o socket.io rodar com meu certificado SSL, no entanto, ele não se conectará.
Baseei meu código no exemplo do 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, no entanto, recebo uma solicitação para http://domain.com/socket.io/1/?t=1309967919512
Observe que não está tentando https, o que causa uma falha.
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!
Respostas:
Use uma URL segura 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) também para a conexão WebSocket.
Atualização :
Você também pode tentar criar a conexão usando a opção 'segura':
fonte
{secure: true}
não deve ser necessário se você especificar 'https' no URL. Aqui está um trecho da fonte do cliente socket.iosecure: 'https' == uri.protocol
(versão 0.9.16), que define a opção segura como true se https for detectado no URL.{secure: true}
não era necessário para funcionar corretamente.Foi assim que consegui configurá-lo com o express:
Espero que isso economize o tempo de alguém.
Atualização: para aqueles que usam vamos criptografar, use este
fonte
var server = https.createServer({ key: fs.readFileSync('/etc/letsencrypt/live/domain.name/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/domain.name/cert.pem'), ca: fs.readFileSync('/etc/letsencrypt/live/domain.name/chain.pem'), requestCert: false, rejectUnauthorized: false },app); server.listen(3000);
Na mesma nota, se o servidor suportar os dois
http
ehttps
você puder se conectar usando:para detectar automaticamente o esquema do navegador e conectar-se usando http / https adequadamente. quando em https, o transporte será protegido por padrão, como conectar usando
usará soquetes da web seguros -
wss://
(isso{secure: true}
é redundante).para obter mais informações sobre como servir http e https facilmente usando o mesmo servidor de nó, confira esta resposta .
fonte
Se o arquivo certificado do servidor não for confiável (por exemplo, você pode gerar o keystore sozinho com o comando keytool em java), adicione a opção extra rejectUnauthorized
fonte
verifique this.configuration ..
fonte
Lado do servidor:
Lado do cliente:
fonte
Dependendo de suas necessidades, você pode permitir conexões seguras e não seguras e ainda usar apenas uma instância do Socket.io.
Você simplesmente precisa instanciar dois servidores, um para HTTP e outro para HTTPS e, em seguida, anexar esses servidores à instância Socket.io.
Lado do servidor:
Lado do cliente:
Se o servidor NodeJS for diferente do servidor da Web, talvez você precise definir alguns cabeçalhos do CORS. Portanto, no lado do servidor, substitua:
Com:
E, é claro, ajuste os valores dos cabeçalhos de acordo com suas necessidades.
fonte
Para aplicativos corporativos, observe que você não deve manipular https no seu código. Ele deve ser atualizado automaticamente via IIS ou nginx. O aplicativo não deve saber sobre quais protocolos são usados.
fonte
Este é o meu arquivo de configuração nginx e o código iosocket. O servidor (expresso) está escutando na porta 9191. Funciona bem: arquivo de configuração nginx:
Servidor:
Cliente (reação):
fonte