Próbuję uruchomić socket.io z moim certyfikatem SSL, jednak nie łączy się.
Oparłem swój kod na przykładzie czatu:
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});
...
Jeśli usunę kod SSL, działa dobrze, jednak wraz z nim otrzymuję żądanie na adres http://domain.com/socket.io/1/?t=1309967919512
Zauważ, że nie próbuje https, co powoduje niepowodzenie.
Testuję na chrome, ponieważ jest to przeglądarka docelowa dla tej aplikacji.
Przepraszam, jeśli jest to proste pytanie, jestem nowicjuszem node / socket.io.
Dzięki!
Odpowiedzi:
Użyj bezpiecznego adresu URL do początkowego połączenia, tj. Zamiast „http: //” użyj „https: //”. Jeśli wybrano transport WebSocket, Socket.IO powinien automatycznie używać „wss: //” (SSL) również dla połączenia WebSocket.
Aktualizacja :
Możesz także spróbować utworzyć połączenie, korzystając z opcji „bezpieczne”:
źródło
{secure: true}
nie powinno być potrzebne, jeśli w adresie URL określisz „https”. Oto fragment źródła klienta socket.iosecure: 'https' == uri.protocol
(wersja 0.9.16), ustawia on bezpieczną opcję na wartość true, jeśli w adresie URL zostanie wykryty protokół https.{secure: true}
nie było to wymagane do prawidłowego działania.Oto jak udało mi się ustawić to z express:
Mam nadzieję, że to komuś zaoszczędzi czas.
Aktualizacja: dla tych, którzy używają Let's Encrypt, użyj tego
źródło
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);
Z tego samego powodu, jeśli twój serwer obsługuje oba
http
ihttps
możesz połączyć się za pomocą:aby automatycznie wykryć schemat przeglądarki i połączyć się odpowiednio za pomocą protokołu http / https. gdy jest w https, transport będzie domyślnie zabezpieczony, jako połączenie za pomocą
użyje bezpiecznych gniazd sieciowych -
wss://
({secure: true}
jest nadmiarowy).Aby uzyskać więcej informacji o tym, jak łatwo obsługiwać zarówno protokół http, jak i https przy użyciu tego samego serwera węzłowego, zapoznaj się z tą odpowiedzią .
źródło
Jeśli plik certyfikatu serwera nie jest zaufany (na przykład możesz samodzielnie wygenerować magazyn kluczy za pomocą polecenia keytool w java), powinieneś dodać dodatkową opcję odrzucenieUnauthorized
źródło
sprawdź tę konfigurację ..
źródło
Po stronie serwera:
Strona klienta:
źródło
W zależności od potrzeb możesz zezwolić na bezpieczne i niezabezpieczone połączenia i nadal używać tylko jednej instancji Socket.io.
Wystarczy zainstalować dwa serwery, jeden dla HTTP i jeden dla HTTPS, a następnie podłączyć te serwery do instancji Socket.io.
Po stronie serwera :
Strona klienta :
Jeśli twój serwer NodeJS różni się od twojego serwera WWW, być może będziesz musiał ustawić kilka nagłówków CORS. Więc po stronie serwera zamień:
Z:
I oczywiście dostosuj wartości nagłówków do swoich potrzeb.
źródło
W przypadku aplikacji korporacyjnych należy zauważyć, że nie należy obsługiwać protokołu HTTPS w swoim kodzie. Powinien zostać zaktualizowany automatycznie za pośrednictwem usług IIS lub nginx. Aplikacja nie powinna wiedzieć, jakie protokoły są używane.
źródło
To jest mój plik konfiguracyjny nginx i kod iosocket. Serwer (express) nasłuchuje na porcie 9191. Działa dobrze: plik konfiguracyjny nginx:
Serwer:
Klient (reaguje):
źródło