Ich versuche, socket.io mit meinem SSL-Zertifikat zum Laufen zu bringen, es wird jedoch keine Verbindung hergestellt.
Ich habe meinen Code anhand des Chat-Beispiels erstellt:
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});
...
Wenn ich den SSL-Code entferne, läuft er einwandfrei, erhalte jedoch eine Anfrage an http://domain.com/socket.io/1/?t=1309967919512
Beachten Sie, dass https nicht versucht wird, was dazu führt, dass es fehlschlägt.
Ich teste auf Chrome, da es der Zielbrowser für diese Anwendung ist.
Ich entschuldige mich, wenn dies eine einfache Frage ist, ich bin ein Node / Socket.io-Neuling.
Vielen Dank!
Antworten:
Verwenden Sie eine sichere URL für Ihre erste Verbindung, dh verwenden Sie anstelle von "http: //" "https: //". Wenn der WebSocket-Transport ausgewählt ist, sollte Socket.IO auch für die WebSocket-Verbindung automatisch "wss: //" (SSL) verwenden.
Update :
Sie können auch versuchen, die Verbindung mit der Option "Sicher" herzustellen:
quelle
{secure: true}
sollte nicht benötigt werden, wenn Sie in der URL 'https' angeben. Hier ist ein Auszug aus der Client-Quelle von socket.iosecure: 'https' == uri.protocol
(Version 0.9.16). Er setzt die sichere Option auf true, wenn https in der URL erkannt wird.{secure: true}
nicht richtig funktionieren.So habe ich es mit Express eingerichtet:
Ich hoffe, dass dies jemandem Zeit spart.
Update: Für diejenigen, die verwenden, können wir dies verschlüsseln
quelle
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);
Wenn Ihr Server beide unterstützt
http
undhttps
Sie eine Verbindung herstellen können mit:zum Auto des Browsers Schema erkennt mit http / https entsprechend und verbinden. In https wird der Transport standardmäßig als Verbindung mit gesichert
verwendet sichere Web-Sockets -
wss://
(das{secure: true}
ist redundant).Weitere Informationen dazu, wie Sie sowohl http als auch https problemlos mit demselben Knotenserver bereitstellen können, finden Sie in dieser Antwort .
quelle
Wenn Ihre serverzertifizierte Datei nicht vertrauenswürdig ist (z. B. können Sie den Schlüsselspeicher selbst mit dem Befehl keytool in Java generieren ), sollten Sie die zusätzliche Option "RejectUnauthorized" hinzufügen
quelle
Überprüfen Sie diese Konfiguration.
quelle
Serverseitig:
Client-Seite:
quelle
Abhängig von Ihren Anforderungen können Sie sowohl sichere als auch unsichere Verbindungen zulassen und dennoch nur eine Socket.io-Instanz verwenden.
Sie müssen lediglich zwei Server instanziieren, einen für HTTP und einen für HTTPS, und diese Server dann an die Socket.io-Instanz anschließen.
Serverseite:
Client-Seite:
Wenn sich Ihr NodeJS-Server von Ihrem Webserver unterscheidet, müssen Sie möglicherweise einige CORS-Header festlegen. Ersetzen Sie also auf der Serverseite:
Mit:
Und natürlich passen Sie die Werte der Header an Ihre Bedürfnisse an.
quelle
Bei Unternehmensanwendungen sollte beachtet werden, dass Sie in Ihrem Code kein https verarbeiten sollten. Es sollte automatisch über IIS oder Nginx aktualisiert werden. Die App sollte nicht wissen, welche Protokolle verwendet werden.
quelle
Dies ist meine Nginx-Konfigurationsdatei und mein Iosocket-Code. Server (Express) überwacht Port 9191. Es funktioniert gut: Nginx-Konfigurationsdatei:
Server:
Kunde (reagieren):
quelle