Configurer Let's Encrypt pour Express

Comment configurer HTTPS à l'aide de la solution gratuite populaire Let's Encrypt

Si vous exécutez une application Node.js sur votre propre VPS, vous aurez besoin d'une solution pour obtenir des certificats SSL.

Aujourd'hui, la norme pour ce faire est d'utiliserCrypteronsetCertbot, un outil deEFF, alias Electronic Frontier Foundation, la principale organisation à but non lucratif axée sur la vie privée, la liberté d'expression et les libertés civiles en général dans le monde numérique.

Voici les étapes que nous suivrons:

Installez Certbot

Ces instructions supposent que vous utilisez Ubuntu, Debian ou toute autre distribution Linux utilisantapt-getpour gérer les packages:

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

Vous pouvez également installer Certbot sur un Mac, à des fins de test (nécessiteHomebrew):

brew install certbot

Cependant, vous devrez lier cela à un vrai nom de domaine pour qu'il soit utile.

Générer le certificat SSL à l'aide de Certbot

Maintenant que Certbot est installé, vous pouvez l'invoquer pour générer le certificat. Vous devez l'exécuter en tant que root:

certbot certonly --manual

… Ou appelez sudo depuis un utilisateur non root:

sudo certbot certonly --manual

Voici le processus en détail:

Le programme d'installation vous demandera de fournir le domaine de votre site Web.

… Il vous demande ensuite votre e-mail:

➜ sudo certbot certonly --manual
Password: XXXXXXXXXXXXXXXXXX
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator manual, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): [email protected]

… Et pour accepter les conditions d'utilisation:

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory

(A)gree/©ancel: A

… Et pour obtenir l'autorisation de partager votre adresse e-mail:

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

… Enfin, nous pouvons entrer le domaine où nous voulons utiliser le certificat SSL:

Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): copesflavio.com

… L'installateur vous demande si vous pouvez enregistrer votre adresse IP:

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for copesflavio.com

NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you’re running certbot in manual mode on a machine that is not your server, please ensure you’re okay with that.

Are you OK with your IP being logged?


(Y)es/(N)o: y

… Et enfin nous arrivons à la phase de vérification!

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

And make it available on your web server at this URL:

http://copesflavio.com/.well-known/acme-challenge/TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E

Maintenant, laissons Certbot seul pendant quelques minutes.

Nous devons vérifier que nous possédons le domaine, en créant un fichier nomméTS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2Edans le.well-known/acme-challenge/dossier. Faites attention! La chaîne étrange que je viens de coller changera à chaque fois que vous suivrez ce processus.

Vous devrez créer le dossier et le fichier, car ils n'existent pas par défaut.

Dans ce fichier, vous devez mettre le contenu imprimé par Certbot:

TS_oZ2-ji23jrio3j2irj3iroj_U51u1o0x7rrDY2E.1DzOo_voCOsrpddP_2kpoek2opeko2pke-UAPb21sW1c

Quant au nom de fichier, cette chaîne est unique à chaque fois que vous exécutez Certbot.

Autoriser Express à diffuser des fichiers statiques

Pour diffuser ce fichier à partir d'Express, vous devez activer la diffusion de fichiers statiques. Vous pouvez créer unstaticdossier, et ajoutez-y le.well-knownsous-dossier, puis configurez Express comme ceci:

const express = require('express')
const app = express()

//… app.use(express.static(__dirname + ‘/static’, { dotfiles: ‘allow’ }))

//…

Ledotfilesl'option est obligatoire sinon.well-known, qui est un dotfile (comme il commence par un point), ne sera pas rendu visible. Il s'agit d'une mesure de sécurité, car les fichiers dotfiles peuvent contenir des informations sensibles et il est préférable de les conserver par défaut.

Confirmer le domaine

Maintenant, exécutez l'application et assurez-vous que le fichier est accessible à partir de l'Internet public. Revenez à Certbot, qui est toujours en cours d'exécution, et appuyez sur ENTRÉE pour continuer avec le script.

Obtenez le certificat

C'est tout! Si tout s'est bien passé, Certbot a créé le certificat et la clé privée, et les a mis à disposition dans un dossier sur votre ordinateur (et il vous dira quel dossier, bien sûr).

Maintenant, copiez / collez simplement les chemins dans votre application pour commencer à les utiliser pour répondre à vos demandes:

const fs = require('fs')
const https = require('https')
const app = express()

app.get(’/’, (req, res) => { res.send(‘Hello HTTPS!’) })

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Notez que j'ai fait écouter ce serveur sur le port 443, il doit donc être exécuté avec les autorisations root.

De plus, le serveur fonctionne exclusivement en HTTPS, car j'ai utiliséhttps.createServer(). Vous pouvez également déployer un serveur HTTP en parallèle, en exécutant:

http.createServer(app).listen(80, () => {
  console.log('Listening...')
})

https .createServer( { key: fs.readFileSync(’/etc/letsencrypt/path/to/key.pem’), cert: fs.readFileSync(’/etc/letsencrypt/path/to/cert.pem’), ca: fs.readFileSync(’/etc/letsencrypt/path/to/chain.pem’), }, app ) .listen(443, () => { console.log(‘Listening…’) })

Configurer le renouvellement

Le certificat SSL ne sera valide que pendant 90 jours, vous devez donc mettre en place un système automatisé pour le renouveler.

Comment? Utilisation d'un travail cron.

Une tâche cron est un moyen d'exécuter des tâches à un intervalle de temps spécifié. Cela peut être chaque semaine, chaque minute, chaque mois, etc.

Dans notre cas, nous exécuterons le script de renouvellement deux fois par jour, comme recommandé dans la documentation Certbot.

Tout d'abord, découvrez le chemin absolu decertbotsur votre système. j'utilisetype certbotsur macOS pour l'obtenir, et dans mon cas, c'est dans/usr/local/bin/certbot.

Voici le script que nous devons exécuter:

certbot renew

Voici l'entrée de tâche cron:

0 */12 * * * root /usr/local/bin/certbot renew >/dev/null 2>&1

Ce qui précède dit «exécutez-le toutes les 12 heures, tous les jours: à 00h00 et à 12h00».

Astuce: j'ai généré cette ligne en utilisanthttps://crontab-generator.org/

Ajoutez votre script nouvellement créé à la crontab du système à l'aide de cette commande:

env EDITOR=pico crontab -e

Cela ouvre lepicoéditeur (n'hésitez pas à le remplacer par l'éditeur que vous préférez). Entrez simplement le nouveau script, enregistrez et le travail cron est installé.

Une fois que cela est fait, vous pouvez voir la liste des tâches cron actives en exécutant:

crontab -l

Téléchargez mon gratuitManuel Express.js


Plus de tutoriels express: