Tengo problemas para configurar un servidor wss (Secure Websocket Server) en node.js. Cuando ejecutamos el servidor y lo probamos con un probador de websocket en línea y nos conectamos a wss://localhost:8888 , funciona. Pero cuando nos conectamos a wss://my_ip:8888 (ip encontrada con ifconfig ) da como resultado el error index.js:15 WebSocket connection to 'wss://192.168.1.217:8888/' failed .
Creé un repositorio de git para realizar pruebas fácilmente: https://github.com/DaanS8/wss_error
El código se ejecuta en un ubuntu vm en una máquina con Windows. Parece que ubuntu vm no tiene su propio firwall ( sudo ufw status da como resultado un error), simplemente apagar el firewall de Windows no cambia los errores.
Los certificados se generaron con los siguientes comandos:
openssl genrsa -des3 -out myCA.key 2048 openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.pem Enter pass phrase for myCA.key: Country Name (2 letter code) [AU]:BE State or Province Name (full name) [Some-State]:Vlaams-Brabant Locality Name (eg, city) []:Leuven Organization Name (eg, company) [Internet Widgits Pty Ltd]:KU Leuven Organizational Unit Name (eg, section) []:Pno Common Name (eg server FQDN or YOUR name) []:Team x Email Address []:xxxx@xxxxxxxx.be openssl rsa -in myCA.key -text > private.pemMis principales fuentes:
principales.ts:
// Minimal amount of secure websocket server var fs = require('fs'); // read ssl certificate var privateKey = fs.readFileSync('certs/private.pem', 'utf8'); var certificate = fs.readFileSync('certs/myCA.pem', 'utf8'); var credentials = { key: privateKey, cert: certificate }; var https = require('https'); //pass in your credentials to create an https server var httpsServer = https.createServer(credentials); httpsServer.listen(8888); var WebSocketServer = require('ws').Server; var wss = new WebSocketServer({ server: httpsServer }); wss.on('connection', function connection(ws) { ws.on('message', function incoming(message) { console.log('received: %s', message); ws.send('reply from server : ' + message) }); ws.send('something'); });Ver github para claves, etc.
Prueba a usar cloudflaired
para descargar: Haga clic aquí
tutoría: haga clic aquí
puede ser el problema de las reglas del firewall y otros factores
EDITAR:
Este programa incluye un servidor liviano que actúa como un puente entre su computadora y los servidores de Cloudflair. Esto aloja el sitio en un subdominio temporal de forma gratuita.
si tiene una cuenta de cloudflair, le ayudará a establecer y configurar direcciones URL permanentes estáticas en lugar de cambiar dinámicamente cada vez
Lo siento, no sé sobre los precios ya que uso el plan gratuito para obtener más información, visite los documentos
Debido a esto, puede eludir muchas restricciones de Windows (como firewall), restricciones de isp (como nat), etc. Para que pueda concentrarse en el proyecto
También esto funciona incluso fuera de tu LAN. Solo para que sepas que también funciona fuera de la LAN. para compartir una vista previa rápida con otros.
Su "probador de websocket en línea" no proporciona un código fuente fácilmente legible, por lo que no está claro qué está fallando. Mi conjetura: la validación del certificado TLS está fallando. (Los navegadores pueden tener sus propias reglas para localhost , por lo que puede funcionar para localhost en algunos navegadores).
Se está conectando a la IP , pero se genera Common Name: Team x . La implementación correcta del cliente TLS debería rechazar este tipo de conexión TLS, porque el nombre del servidor no coincide con el nombre TLS CN ('IP'!='Team x').
Soluciones:
1.) Genere el certificado TLS adecuado, donde Common Name coincida con la IP utilizada. Esta es una solución segura adecuada para su caso de uso (generalmente se usa el FQDN del servidor, porque el dominio se usa para la conexión y no la IP del servidor).
2.) Use el cliente websocket, que brinda la opción de deshabilitar la verificación de certificados.
3.) Abra https://IP:8888 y agregue la excepción TLS del navegador para el certificado usado. La excepción debe aplicarse también para el protocolo wss entonces.