2016-01-27 23 views
8

sto ottenendo questo errore quando tento di stabilire una connessione wss con il mio server:WebSocket Errore nella creazione di connessione: net :: ERR_CONNECTION_CLOSED

collegamento WebSocket a 'WSS: // mydomain: 3000 /' non riuscita : Errore nella creazione collegamento: net :: ERR_CONNECTION_CLOSED

al momento ho una messa a punto apache2 configurazione dell'host virtuale per l'ascolto delle richieste sulla porta 443 e 80:

<VirtualHost *:80> 
     ServerName otherdomainname.co.uk 
     ServerAlias www.otherdomainname.co.uk 

     RewriteEngine On 
     RewriteRule ^/(.*)$ /app/$1 [l,PT] 

     JkMount /* worker2 

</VirtualHost> 

<VirtualHost _default_:443> 
     ServerName otherdomainname.co.uk 
     ServerAlias www.otherdomainname.co.uk 

     RewriteEngine On 
     RewriteRule ^/(.*)$ /app/$1 [l,PT] 

     SSLEngine On 
     SSLCertificateFile /etc/apache2/ssl/apache.crt 
     SSLCertificateKeyFile /etc/apache2/ssl/apache.key 

     <Location /> 
     SSLRequireSSL On 
     SSLVerifyClient optional 
     SSLVerifyDepth 1 
     SSLOptions +StdEnvVars +StrictRequire 
     </Location> 

     JkMount /* worker2 

</VirtualHost> 

Come si può vedere, utilizza JkMount per passare la richiesta a Tomcat che serve correttamente la pagina Web su HTTP e HTTPS.

Quando visito il sito utilizzando il protocollo HTTP sulla porta 80, è possibile effettuare una connessione WebSocket utilizzando il protocollo ws.

Quando visito il sito utilizzando il protocollo HTTPS sulla porta 443, il sito viene servito correttamente ma non viene effettuata alcuna connessione WebSocket utilizzando wss.

Sto usando le "WS" Node.JS modulo per fornire il server WebSocket:

var WebSocketServer = require('ws').Server 
    , wss = new WebSocketServer({ port: 3000 }), 
    fs = require('fs'); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 

    ws.send(message); 
    ws.send('something'); 
}); 

Perché non sono in grado di successo connettersi al server utilizzando il protocollo WebSocket wss sopra https?

risposta

9

Il problema era che non ero configurato per il server WebSocket per https/wss.

Ecco la versione sicura del mio server WebSocket non sicuro che utilizza "ws" da node.js.

var WebSocketServer = require('ws').Server, 
    fs = require('fs'); 


var cfg = { 
     ssl: true, 
     port: 3000, 
     ssl_key: '/path/to/apache.key', 
     ssl_cert: '/path/to/apache.crt' 
    }; 

var httpServ = (cfg.ssl) ? require('https') : require('http'); 

var app  = null; 

var processRequest = function(req, res) { 

    res.writeHead(200); 
    res.end("All glory to WebSockets!\n"); 
}; 

if (cfg.ssl) { 

    app = httpServ.createServer({ 

     // providing server with SSL key/cert 
     key: fs.readFileSync(cfg.ssl_key), 
     cert: fs.readFileSync(cfg.ssl_cert) 

    }, processRequest).listen(cfg.port); 

} else { 

    app = httpServ.createServer(processRequest).listen(cfg.port); 
} 

var wss = new WebSocketServer({ server: app }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
    console.log('received: %s', message); 

    ws.send(message); 

    }); 

    ws.send('something'); 
}); 
+1

Dove lo configuro? Sono nuovo di Node.JS e ho riscontrato questo problema. – Andy

+0

È necessario configurare il server Web per la crittografia a chiave pubblica e fornire le informazioni su chiave e certificato. http://chrismepham.co.uk/blog/guide/how-to-convert-a-web-application-from-http-to-https/ – crm

0

Avevo un problema simile, risulta che stavo usando CloudFlare che consente solo porte molto specifiche.

Quindi la meteora in esecuzione sulla porta 3000 è stata bloccata all'istante.

La riconfigurazione delle impostazioni del mio proxy inverso e l'esecuzione di Meteor su una porta consentita ha risolto il problema.

Ma, alla fine, ho spento le prese sulla mia distribuzione Meteor. Non sembra avere prestazioni influenzate. Buona fortuna,