J'essaye de faire fonctionner socket.io avec mon certificat SSL cependant, il ne se connectera pas.
J'ai basé mon code sur l'exemple 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 je supprime le code SSL, il fonctionne bien, mais avec lui, je reçois une demande à http://domain.com/socket.io/1/?t=1309967919512
Notez qu'il n'essaye pas de https, ce qui le fait échouer.
Je teste sur chrome, car c'est le navigateur cible de cette application.
Je m'excuse si c'est une question simple, je suis un débutant node / socket.io.
Merci!
Réponses:
Utilisez une URL sécurisée pour votre connexion initiale, c'est-à-dire au lieu de "http: //" utilisez "https: //". Si le transport WebSocket est choisi, Socket.IO doit également utiliser automatiquement "wss: //" (SSL) pour la connexion WebSocket.
Mise à jour :
Vous pouvez également essayer de créer la connexion en utilisant l'option «sécurisé»:
la source
{secure: true}
ne devrait pas être nécessaire si vous spécifiez «https» dans l'url. Voici un extrait de la source du client socket.iosecure: 'https' == uri.protocol
(version 0.9.16), il définit l'option secure sur true si https est détecté dans l'url.{secure: true}
n'était en effet pas nécessaire pour fonctionner correctement.C'est ainsi que j'ai réussi à le configurer avec express:
J'espère que cela fera gagner du temps à quelqu'un.
Mise à jour: pour ceux qui utilisent permet de chiffrer, utilisez ceci
la source
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);
Dans le même ordre d'idées, si votre serveur prend en charge les deux
http
et quehttps
vous pouvez vous connecter en utilisant:pour détecter automatiquement le schéma du navigateur et vous connecter en utilisant http / https en conséquence. en https, le transport sera sécurisé par défaut, car la connexion en utilisant
utilisera des sockets Web sécurisés -
wss://
(le{secure: true}
est redondant).pour plus d'informations sur la façon de servir facilement à la fois http et https à l'aide du même serveur de nœud, consultez cette réponse .
la source
Si le fichier certifié de votre serveur n'est pas approuvé (par exemple, vous pouvez générer le fichier de clés vous-même avec la commande keytool en java), vous devez ajouter l'option supplémentaire rejet
la source
vérifiez cette configuration.
la source
Du côté serveur:
Côté client:
la source
En fonction de vos besoins, vous pouvez autoriser les connexions sécurisées et non sécurisées tout en n'utilisant qu'une seule instance de Socket.io.
Vous devez simplement instancier deux serveurs, un pour HTTP et un pour HTTPS, puis attacher ces serveurs à l'instance Socket.io.
Du côté serveur :
Côté client :
Si votre serveur NodeJS est différent de votre serveur Web, vous devrez peut-être définir des en-têtes CORS. Donc côté serveur, remplacez:
Avec:
Et bien sûr, ajustez les valeurs des en-têtes en fonction de vos besoins.
la source
Pour les applications d'entreprise, il convient de noter que vous ne devez pas gérer https dans votre code. Il doit être mis à niveau automatiquement via IIS ou nginx. L'application ne doit pas savoir quels protocoles sont utilisés.
la source
Ceci est mon fichier de configuration nginx et mon code iosocket. Le serveur (express) écoute sur le port 9191. Cela fonctionne bien: fichier de configuration nginx:
Serveur:
Client (réagir):
la source