web-dev-qa-db-fra.com

Comment utiliser HTTPS sur Node.js avec Express / Socket.io

J'essaie de faire fonctionner mon serveur de noeud avec https. J'utilise express et socket.io.

Ceci est mon code pour https:

var httpsPort = 443;
var privateKey = fs.readFileSync(mykeypath');
var certificate = fs.readFileSync(mycertificatepath');
var credentials = {key: privateKey, cert: certificate};
var https = require('https').Server(credentials,app);
var io = require('socket.io')(https);

https.listen(httpsPort, function(){
logger.info('listening on *:' + httpsPort);
});


app.get('/initGame', function (req,res){

var slots = require('./slots.json', 'utf8');
var userObject = {
    address : req.connection.remoteAddress,
    userAgent : req.headers['user-agent']
};
db.getPlayedGames(userObject,function(playedGames){
    logger.debug(playedGames);
    if(typeof playedGames == 'undefined' ){
        playedGames=0;
    }else{
        playedGames = playedGames.games_played;
    }
    var spinsLeft = 10-playedGames;
    res.json({
        spinsLeft: spinsLeft,
        slots: slots
    });
  });
});

sur mon client c'est la suivante:

var myServer = "//" + document.domain + ":443";

$.get( myServer + "/initGame", function(data) {
    totalSpinsLeft = data.spinsLeft;
    $('#trysLeft').text(totalSpinsLeft);
    Seven.init(data.slots);
}).fail(function(){
    setTimeout(function(){
        $('#spinner2').text('Fehler bitte neu laden!');
    },3000);

});

À l'heure actuelle, j'obtiens l'exception suivante sur mon serveur:

uncaughtException: PFX ou certificat manquant + clé privée.

EDIT: maintenant im obtenir

Mauvaise Demande

Votre navigateur a envoyé une demande que ce serveur n'a pas pu comprendre. Raison: vous parlez simplement avec HTTP sur un port de serveur compatible SSL. Utilisez plutôt le schéma HTTPS pour accéder à cette URL, s'il vous plaît.

26
kovogel

Il est difficile de tester votre exemple sans votre clé et vos fichiers de certificat. Je vais plutôt vous donner un exemple d'utilisation de Express, socket.io et https.

Tout d'abord, je vais créer les fichiers de clé et de cert. Dans un répertoire, exécutez les commandes suivantes à partir de votre terminal:

La commande ci-dessous va générer un fichier contenant une clé RSA.

$ openssl genrsa 1024 > file.pem

Ici, il vous sera demandé de saisir des données, mais vous pouvez laisser vide en appuyant sur Entrée jusqu'à ce que le fichier crs.pem soit généré.

$ openssl req -new -key file.pem -out csr.pem

Ensuite, un fichier file.crt sera créé contenant un certificat SSL.

$ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt

Donc dans mon app.js fichier où je configure et démarre le serveur, notez que j’utilise les fichiers file.pem et file.crt générés à la dernière étape:

var fs = require('fs');
var https = require('https');

var express = require('express');
var app = express();

var options = {
  key: fs.readFileSync('./file.pem'),
  cert: fs.readFileSync('./file.crt')
};
var serverPort = 443;

var server = https.createServer(options, app);
var io = require('socket.io')(server);

app.get('/', function(req, res) {
  res.sendFile(__dirname + '/public/index.html');
});

io.on('connection', function(socket) {
  console.log('new connection');
  socket.emit('message', 'This is a message from the dark side.');
});

server.listen(serverPort, function() {
  console.log('server up and running at %s port', serverPort);
});

et puis mon public/index.html où je consomme le serveur:

<!doctype html>
<html>

  <head>

  </head>
  <body>
    <h1>I am alive!!</h1>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.js"></script>

    <script>
      var URL_SERVER = 'https://localhost:443';
      var socket = io.connect(URL_SERVER);

      socket.on('message', function(data) {
        alert(data);
      });
    </script>
  </body>

</html>

puis finalement si vous accédez depuis le navigateur à https://localhost, vous verrez une alerte avec un message provenant du serveur Websocket.

69
Wilson

Voici comment j'ai réussi à le configurer avec express:

var fs = require( 'fs' );
var app = require('express')();
var https        = require('https');
var server = https.createServer({
    key: fs.readFileSync('./test_key.key'),
    cert: fs.readFileSync('./test_cert.crt'),
    ca: fs.readFileSync('./test_ca.crt'),
    requestCert: false,
    rejectUnauthorized: false
},app);
server.listen(8080);

var io = require('socket.io').listen(server);

io.sockets.on('connection',function (socket) {
    ...
});

app.get("/", function(request, response){
    ...
})

J'espère que cela sauvera du temps à quelqu'un.

2
emonik