Créer un serveur HTTPS avec NodeJS et Express

nodejs

NodeJS est la grande tendance actuelle et de nombreux projets émergents se basent dessus.

Express, module HTTP de NodeJS, permet de réaliser rapidement un serveur HTTP dans votre application NodeJS.

Il existe de nombreux tutoriaux sur le net permettant d’instancier un serveur Web en quelques lignes de code en utilisant Express.

Mais la réalisation de plusieurs applications pour mes clients a fait émerger un besoin récurrent: créer un serveur HTTPS en NodeJS (HTTP over SSL/TLS).

En effet, le HTTPS permet de crypter les données qui transitent entre les clients et le serveur, ce qui permet de sécuriser un minimum les transactions, qui ne transistent plus en clair sur le réseau.

Nous allons donc voir comment créer un serveur HTTPS en NodeJS avec le module Express.

Générer un certificat autosigné

La première chose à faire lorsque l’on souhaite créer un serveur HTTPS en NodeJS est de récupérer un certificat SSL.

Plusieurs solutions s’offrent à nous:

  • acheter un certificat SSL auprès de compagnies certifiées
  • générer un certificat auto-signé soi même

Puisque nos applications sont réservées à un usage interne uniquement, nous allons générer un certificat auto-signé nous même.

Pour cela, vous devez avoir installé OpenSSL. Ensuite vous pouvez ouvrir une ligne de commande et saisir ce qui suit:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365

Il ne vous reste plus qu’à répondre aux questions et à la fin 2 fichiers seront créés: cert.pem et key.pem.

openssl nodejs

générer les certificats ssl pour NodeJS

Vous noterez que dans notre exemple le certificat SSL aura une durée de validité de 365 jours.

Création du serveur HTTPS avec NodeJS et Express

Il est très simple de créer un serveur HTTPS avec NodeJS et Express. Tout d’abord, pensez à installer le module Express:

npm install -g express

Ensuite, dans un fichier index.js, saisissez le code suivant:

var fs = require('fs'),
  https = require('https'),
  express = require('express'),
  app = express();
 
https.createServer({
  key: fs.readFileSync('key.pem'),
  cert: fs.readFileSync('cert.pem')
}, app).listen(443);
 
app.get('/', function(req, res) {
  res.header('Content-type', 'text/html');
  return res.end('<h1>HTTPS WORKS!</h1>');
});

Ensuite, placez les fichiers cert.pem et key.pem à coté du fichier index.js et lancez la commande suivante:

node index.js

Il se peut qu’une erreur de ce type soit déclenchée:

nodejs https>node index.js
_tls_common.js:87
        c.context.setKey(options.key);
                  ^
Error: error:0907B068:PEM routines:PEM_READ_BIO_PRIVATEKEY:bad password read
    at Error (native)
    at Object.createSecureContext (_tls_common.js:87:19)
    at Server (_tls_wrap.js:718:25)
    at new Server (https.js:17:14)
    at Object.exports.createServer (https.js:37:10)
    at Object.<anonymous> (C:\Zzem.Fr\_ExpressHttps\nodejs https\index.js:6:7)
    at Module._compile (module.js:434:26)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)

Dans ce cas, il faut supprimer le mot de passe avec la commande suivante:

openssl rsa -in key.pem -out newkey.pem

Renommez le fichier newkey.pem en key.pem et vous pourrez alors vous connecter sur votre serveur HTTPS NodeJs en allant sur l’url suivante: https://127.0.0.1:443

https nodejs express

https nodejs express

Le port 443 est le port HTTPS généralement utilisé, mais rien ne vous empêche de définir le port que vous désirez (entre 1 et 65535).

Leave a Reply

Your email address will not be published. Required fields are marked *