HTTPS avec Let’s Encrypt sur un VPS OVH

Ronan Barbot
02/10/2018

Chez Slickteam, notre plateforme fonctionne sur un serveur privé virtuel (VPS) hébergé chez OVH. Pour les sites et applications web hébergés dessus nous avons mis en place du HTTPS afin de sécuriser les échanges HTTP. Nous avons choisi Let’s Encrypt (LE) comme autorité de certification.

Let’s Encrypt est une autorité de certification née en 2014 à partir de la combinaison d’un projet de l’Electronic Frontier Foundation (EFF) et du MIT, et d’un projet de Mozilla. La validation du certificat par l’autorité se fait grâce au protocole ACME, et la version 2 du protocole est sortie en début d’année. Celle-ci permet notamment de valider des certificats wildcard (*.domain.tld).

Il existe plusieurs clients pour LE, mais tous ne supportent pas ACMEv2. Nous avons choisi certbot qui est le client officiel de l’EFF. Celui-ci a l’avantage d’être bien maintenu et de suivre les évolutions du protocole. De plus, il a un système de plugin qui nous servira plus loin dans l’article.

LE a besoin de vérifier que la personne demandant un certificat pour un domaine a bien les droits nécessaires sur celui-ci, et pour cela il existe plusieurs méthodes. Cela commence toujours par un ID généré par LE qui est envoyé au client lors de la demande de certificat, puis en fonction de la méthode :

  • HTTP : il faut que l’ID soit écrit dans un fichier qui sera présent à l’adresse http://domain.tld/.well-known/acme-challenge/<challenge_id>.

  • DNS : il faut que l’ID soit écrit dans un enregistrement TXT nommé _acme-challenge au sein de la zone DNS du domaine.

  • DVSNI : il faut que l’ID soit écrit dans un certificat auto-signé qui sera présenté sur le port 443 du serveur et à l’adresse https://domain.tld.

Pour générer notre certificat wildcard, nous allons utiliser la méthode DNS de LE. Nous avons choisi cette méthode car elle est simple et c’est la seule possible pour l’instant pour avoir un certificat wildcard. Voici donc la commande pour générer le certificat de façon manuelle :

# certbot certonly --manual -d *.domain.tld --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

Notez que la commande spécifie le serveur, cela pour avoir un certificat wildcard. Un certificat LE n’est valable que 3 mois, il faudra donc automatiser son renouvellement.

Maintenant nous allons configurer NGinx pour utiliser ce certificat. Dans le fichier de configuration d’un site, il faut ajouter ces lignes :

server {    # SSL configuration    listen 443 ssl;    listen [::]:443 ssl;    servername site.domain.tld;    sslprotocols TLSv1.2;    sslcertificate /etc/letsencrypt/live/domain.tld/fullchain.pem;    sslcertificatekey /etc/letsencrypt/live/domain.tld/privkey.pem;    ssldhparam /etc/nginx/dh.pem;    sslecdhcurve secp384r1;    sslpreferserverciphers on;    sslciphers EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES;    ssltrustedcertificate /etc/letsencrypt/live/domain.tld/chain.pem;    sslstapling on;    sslstaplingverify on;    sslsessioncache shared:SSL:10m;    sslsessiontimeout 5m;    sslsession_tickets off;    # your configuration}

Si vous souhaitez en savoir plus sur la configuration HTTPS de NGinx, cet article décrit toutes les options utilisées et est très didactique. Pour tester, il ne reste plus qu’à redémarrer NGinx et vérifier sur un navigateur en renseignant l’adresse en HTTPS :

# systemctl stop nginx.service# systemctl start nginx.service

OVH met à disposition une API qui permet entre autres de modifier la zone DNS d’un domaine enregistré chez eux. On peut la tester ici. Grâce à cette page, on peut générer un token applicatif pour l’API OVH. Ce token a une durée de vie définie à la création et est composé de 3 parties (une clé d’application, un secret pour l’application, une clé de consommateur). Pour automatiser la mise à jour de notre zone DNS, plus particulièrement ajouter l’entrée TXT pour la validation du domaine par Let’s Encrypt, nous avons besoin d’avoir accès aux URLs suivantes :

/domain/zone/  GET/domain/zone/  POST/domain/zone/*  DELETE

Pour utiliser cette API et gérer l’authentification pour y accéder, OVH fournit des librairies dans différents langages. Nous n’allons pas nous en servir, car après une recherche sur le web nous avons trouvé un plugin pour certbot qui gère l’authentification et la mise à jour d’une zone DNS chez OVH. Ce plugin est facile à utiliser, et sa conception est bien décrite sur le site de son auteur.

Pour tester ce plugin nous avons suivi les indications sur le site de l’auteur, configuré le fichier /etc/ovh.conf avec les informations issues de la génération du token OVH :

[default]; general configuration: default endpointendpoint=ovh-eu[ovh-eu]; configuration specific to 'ovh-eu' endpointapplicationkey=<yourapplicationkey>applicationsecret=<yourapplicationsecret>consumerkey=<yourconsumer_key>

Afin de préparer l’automatisation de certbot, il faut également renseigner le fichier /etc/letsencrypt/cli.ini avec les informations suivantes :

# use dns-01preferred-challenges = dns# use dns-ovh authenticatorauthenticator = certbot-dns-ovh:dns-ovh# acme serverserver = https://acme-v02.api.letsencrypt.org/directory

Enfin, on lance la commande certbot en mode manuel :

# certbot certonly -d *.domain.tld

Pour vérifier que le certificat a bien été généré et peut être pris en compte par NGinx, nous allons recharger la configuration du service :

# systemctl reload nginx.service

Maintenant que la génération de notre certificat peut se faire juste à l’aide d’une commande, il ne reste plus qu’à l’automatiser. Un petit script bash /opt/ssl/renewlecertificate.sh nous permettra de renouveler le certificat puis de redémarrer NGinx :

#!/bin/bash# renouvellement certificatcertbot certonly -d *.domain.tld# recharger NGinxsystemctl reload nginx.service

On planifie son exécution de manière régulière via un ajout dans la crontab et c’est bon :

42 6   * /opt/ssl/renewlecertificate.sh

Voilà, nous avons désormais un certificat wildcard authentifié par Let’s Encrypt sur notre serveur qui couvre tout notre domaine, et NGINX est configuré pour l’utiliser. Ce certificat est renouvelé automatiquement, et sera pris en compte par NGinx. Nous pouvons ainsi ajouter en toute sérénité des sous-domaines et donc de nouvelles applications, celles-ci seront accessibles en HTTPS.

Slickteam