Installer un serveur NodeJS avec HTTPS

HTTPS devient de plus en plus le protocole par défaut et est très largement poussé par Google et autres.
D'ailleurs, depuis peu, Chrome indique un site en HTTP comme non sécurisé.

Pre-requis

  • Installer nodejs and npm
  • Installer openssl

Note: sous Windows 10, vous pouvez utiliser le sous-système Linux et en ligne de commande avec le shell bash executer les commandes présentées ci-dessous.

Génération d'un certificat auto-signé

En bash avec openssl

    $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout selfsigned.key -out selfsigned.crt

A ce jour, il est préférable d'utiliser 4096 pour le rsa.

Utilisation de HTTPS en pur NodeJS

server-https.js

Créez un fichier server-https.js dans votre projet avec:

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

    const options = {
      key: fs.readFileSync('selfsigned.key'),
      cert: fs.readFileSync('selfsigned.crt')};

    https.createServer(options, (req, res) => {
      res.writeHead(200);
      res.end('home page\n');})
         .listen(8080);

Configuration du package.json pour démarrer le script

package.json

Ajoutez un fichier package.json:

    {
        "name": ...
        "sripts: {
            "start": "node server-https.js"
         }, ...
    }

Tester le server

Pour démarrer le server

    $ npm run start

Et se connecter au server

    $ curl -k https://localhost:8080

Optionnel: ajouter un group renforcé Diffie-Hellman

Vous pouvez ajouter un échange renforcé de clés Diffie-Hellman, qui est utilisé dans la négociation Perfect Forward Secrecy avec les clients.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Avec ExpressJS

Pour le support de HTTP et HTTPS avec un server ExpressJS

Encore plus simple, vous pouvez utiliser ExpressJS pour un server simple et ici ajouter le support de HTTPS:

    const http = require('http');
    const https = require('https');
    const fs = require('fs');

    const options = {
      key: fs.readFileSync('selfsigned.key'),
      cert: fs.readFileSync('selfsigned.crt')};

    const express = require('express');
    var app = express();
    
    // [...] Configure your app here
    
    http.createServer(app).listen(8080);
    https.createServer(options, app).listen(8443);