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.
Pido disculpas si esta es una pregunta simple, soy un novato node / socket.io.
¡Gracias!
Respuestas:
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 usando la opción 'segura':
fuente
{secure: true}
no debería ser necesario si especifica 'https' en la url. Aquí hay un extracto de la fuente del cliente socket.iosecure: 'https' == uri.protocol
(versión 0.9.16), establece la opción segura en verdadero si se detecta https en la url.{secure: true}
, no estaba obligado a funcionar correctamente.Así es como logré configurarlo con express:
Espero que esto le ahorre tiempo a alguien.
Actualización: para aquellos que usan encriptemos use esto
fuente
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);
En la misma nota, si su servidor admite ambos
http
yhttps
puede conectarse usando:para detectar automáticamente el esquema del navegador y conectarse usando http / https en consecuencia. cuando en https, el transporte estará asegurado de forma predeterminada, ya que se conecta utilizando
utilizará sockets web seguros
wss://
(el{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, consulte esta respuesta .
fuente
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 rechazar
fuente
verifique esta configuración ...
fuente
Lado del servidor:
Lado del cliente:
fuente
Dependiendo de sus necesidades, puede permitir conexiones seguras y no seguras y aún así usar solo una instancia de Socket.io.
Simplemente tiene que instanciar dos servidores, uno para HTTP y otro para HTTPS, luego adjuntar esos servidores a la instancia de Socket.io.
Lado del servidor :
Lado del cliente :
Si su servidor NodeJS es diferente de su servidor web, tal vez necesite configurar algunos encabezados CORS. Entonces, en el lado del servidor, reemplace:
Con:
Y, por supuesto, ajuste los valores de los encabezados según sus necesidades.
fuente
Para aplicaciones empresariales, debe tenerse en cuenta que no debe manejar https en su código. Debe actualizarse automáticamente a través de IIS o nginx. La aplicación no debe saber qué protocolos se utilizan.
fuente
Este es mi archivo de configuración nginx y mi código iosocket. El servidor (express) está escuchando en el puerto 9191. Funciona bien: archivo de configuración nginx:
Servidor:
Cliente (reaccionar):
fuente