Certbot

Ubuntu 16.04 LTS – Installation de certificats SSL/TLS avec Certbot (Let’s Encrypt)

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte qui fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé (via l’outil certbot) destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. En janvier 2018, Let’s Encrypt a livré plus 64 millions de certificats SSL/TLS.

1 – Installation

Mettez à jour votre gestionnaire de paquets, ajoutez le repository officiel de Let’s Encrypt et installez le paquet certbot :

2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins Apache et Nginx entièrement automatisés qui mettent à jour la configuration des virtual hosts.

Afin que les serveurs Let’s Encrypt puissent valider votre certificat, votre domaine ou sous-domaine doit pointer vers l’IP de votre serveur. Pour cela, commencez par modifier les règles DNS chez le fournisseur de votre nom de domaine.

1 – standalone

Le plugin standalone nécessite d’écouter sur les ports 80 ou 443 pour effectuer une validation de votre certificat.
Il est donc nécessaire d’arrêter votre serveur Apache ou Nginx.

  • Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :

    Pour Nginx :

    Pour Apache :

  • Arrêtez votre serveur Apache ou Nginx :

    ou

  • Vérifiez que le port 80 n’est pas utilisé :

    Si cette commande n’affiche rien sur la sortie standard, alors le port 80 n’est pas utilisé.

  • Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :

    Sachez qu’il est possible de spécifier une option lors de la génération de votre certificat permettant de forcer Let’s Encrypt de valider votre domaine sur un port en particulier :

    • --preferred-challenges http pour utiliser le port 80
    • --preferred-challenges tls-sni pour utiliser le port 443.

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :

    • cert.pem : le certificat de votre domaine mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :

    Pour Nginx :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • server_name : votre nom de domaine
    • root : répertoire racine de vos ressources web
    • ssl_certificate : chemin vers votre fullchain.pem
    • ssl_certificate_key : chemin vers votre privkey.pem
    • ssl_trusted_certificat : chemin vers votre chain.pem.

    Pour Apache :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • ServerName, Redirect et ServerAlias : votre nom de domaine
    • ServerAdmin : votre email
    • DocumentRoot : répertoire racine de vos ressources web
    • SSLCertificateFile : chemin vers votre cert.pem
    • SSLCertificateKeyFile : chemin vers votre privkey.pem
    • SSLCertificateChainFile : chemin vers votre chain.pem.
  • Démarrez votre serveur Apache ou Nginx :
    ou
  • Rendez-vous sur SSL Labs et testez la sécurité de votre configuration SSL/TLS !

2 – webroot

Le plugin webroot crée un fichier temporaire ${webroot-path}/.well-known/acme-challenge dans le dossier racine de vos ressources web, celui-ci permettra aux serveurs de Let’s Encrypt de valider votre certificat en appelant ce fichier temporaire.

  • Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :

    Pour Nginx :

    Pour Apache :

  • Générez votre certificat en remplaçant /var/www/html et mondomaine.com par vos informations :

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :

    • cert.pem : le certificat de votre domaine mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :

    Pour Nginx :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • server_name : votre nom de domaine
    • root : répertoire racine de vos ressources web
    • ssl_certificate : chemin vers votre fullchain.pem
    • ssl_certificate_key : chemin vers votre privkey.pem
    • ssl_trusted_certificat : chemin vers votre chain.pem

    Pour Apache :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • ServerName, Redirect et ServerAlias : votre nom de domaine
    • ServerAdmin : votre email
    • DocumentRoot : répertoire racine de vos ressources web
    • SSLCertificateFile : chemin vers votre cert.pem
    • SSLCertificateKeyFile : chemin vers votre privkey.pem
    • SSLCertificateChainFile : chemin vers votre chain.pem.
  • Redémarrez votre serveur Apache ou Nginx :
    ou

Si vous utilisez Nginx ou Apache comme proxy reverse et que vous n’avez pas la main sur vos ressources web, il vous sera nécessaire de créer un répertoire spécifique à la validation de Let’s Encrypt et de permettre à votre serveur web d’écrire dans ce répertoire.


  • Créez un répertoire spécifique à la validation de Let’s Encrypt (remplacez par votre domaine) :
  • Ajoutez les lignes suivantes dans votre configuration Nginx ou Apache en modifiant la valeur des directives root pour Nginx et DocumentRoot et Directory pour Apache en fonction du répertoire que vous avez créé précédemment :

    Pour Nginx :

    Pour Apache :

  • Redémarrez votre serveur Apache ou Nginx :

    ou

  • Générez votre certificat en remplaçant /var/www/letsencrypt/mondomaine.com et mondomaine.com par vos informations :

    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :

    • cert.pem : le certificat de votre domaine mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :

    Pour Nginx :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • server_name : votre nom de domaine
    • root : répertoire spécifique à la validation de Let’s Encrypt
    • proxy_pass : IP de votre serveur tiers
    • ssl_certificate : chemin vers votre fullchain.pem
    • ssl_certificate_key : chemin vers votre privkey.pem
    • ssl_trusted_certificat : chemin vers votre chain.pem.

    Pour Apache :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • ServerName, ServerAlias et Redirect : votre nom de domaine
    • ServerAdmin : votre email
    • DocumentRoot et Directory : répertoire spécifique à la validation de Let’s Encrypt
    • ProxyPass et ProxyPassReverse : IP de votre serveur tiers
    • SSLCertificateFile : chemin vers votre cert.pem
    • SSLCertificateKeyFile : chemin vers votre privkey.pem
    • SSLCertificateChainFile : chemin vers votre chain.pem.

3 – manual

Le plugin manual permet de générer un certificat en effectuant la validation du domaine vous-même. Ce plugin permet ainsi de générer des certificats sur un serveur différent de celui où se trouve votre serveur web et sans avoir les droits du super-utilisateur.

  • Partons du principe que vous disposez du virtual host suivant écoutant sur le port 80 :

    Pour Nginx :

    Pour Apache :

  • Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :

  • Il vous sera demandé d’accepter que votre IP soit dans les bases de données de Let’s Encrypt :

  • Afin de prouver à Let’s Encrypt que vous ayez bien la main sur votre serveur web, il vous sera demandé de créer un fichier dans le répertoire de vos ressources web et d’y inclure une clé permettant à Let’s Encrypt de valider votre certificat :

  • Pour cela, ouvrez un nouveau terminal et créez le répertoire .well-known/acme-challenge en remplaçant /var/www/html/ par le répertoire racine de vos ressources web :

  • Créez le fichier secret de validation dans le répertoire précédemment créé en remplaçant la clé nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk.VztX9LSnV1bIEFCVa8uRVuXfntRLl5IJKZz6LRwzX8Q par votre propre clé générée par Let’s Encrypt ainsi que le nom du fichier nLZPRtMnudPxhJ9ChS42omwyhsk7N5Lyy29GOYQCJmk :

  • Fermez ce deuxième terminal, revenez sous votre premier terminal et appuyez sur la touche « Entrée ».
  • Let’s Encrypt génèrera automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :
    • cert.pem : le certificat de votre domaine mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • Modifiez votre virtual host en fonction de votre serveur Nginx ou Apache :

    Pour Nginx :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • server_name : votre nom de domaine
    • root : répertoire racine de vos ressources web
    • ssl_certificate : chemin vers votre fullchain.pem
    • ssl_certificate_key : chemin vers votre privkey.pem
    • ssl_trusted_certificat : chemin vers votre chain.pem.

    Pour Apache :

    Modifiez les directives suivantes en fonction de votre domaine et de votre configuration :

    • ServerName, Redirect et ServerAlias : votre nom de domaine
    • ServerAdmin : votre email
    • DocumentRoot : répertoire racine de vos ressources web
    • SSLCertificateFile : chemin vers votre cert.pem
    • SSLCertificateKeyFile : chemin vers votre privkey.pem
    • SSLCertificateChainFile : chemin vers votre chain.pem.
  • Redémarrez votre serveur Apache ou Nginx :
    ou

4 – apache

Si vous utilisez Apache comme serveur web, le plugin apache permet de générer et d’installer automatiquement des certificats en modifiant directement votre virtual host.

  • Le plugin apache n’est pas intégré par défaut à certbot. vous devez tout d’abord l’installer :
  • Partons du principe que vous disposiez déjà du virtual host suivant écoutant sur le port 80 :
  • Vous devez activer le module ssl :
  • Redémarrez votre serveur Apache :
  • Générez votre certificat en remplaçant mondomaine.com et www.mondomaine.com par vos informations :
  • Il vous sera demandé si vous souhaitez laisser l’accès à la fois HTTP et HTTPS ou forcer toutes les requêtes en HTTPS :

La configuration est terminée ! Rendez-vous désormais sur votre site désormais en HTTPS !

Sachez simplement qu’en arrière plan, Let’s Encrypt a généré un nouveau virtual host mondomaine-le-ssl.conf où l’emplacement de vos certificats et de votre clé privée est spécifié. Il inclut aussi un fichier options-ssl-apache.conf qui permet de configurer SSL pour Apache (l’algorithme de chiffrage, le type de clé supportée, etc.) :

Si la configuration proposée par défaut ne vous convient pas, vous pouvez évidemment modifier le virtual host.

Enfin si vous avez choisi la 2ème option (à savoir forcer toutes les requêtes en HTTPS), en plus d’avoir généré un nouveau virtual host mondomaine-le-ssl.conf comme pour l’option 1, Let’s Encrypt aura automatiquement modifié votre virtual host pour rediriger toutes les requêtes HTTP vers HTTPS :

Let’s Encrypt aura généré automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :

  • cert.pem : le certificat de votre domaine mondomaine.com
  • chain.pem : le certificat Let’s Encrypt
  • fullchain.pem : les certificats cert.pem et chain.pem combinés
  • privkey.pem : la clé privée du certificat.

5 – nginx

Si vous utilisez Nginx comme serveur web, le plugin nginx permet de générer et d’installer automatiquement des certificats en modifiant directement votre virtual host.

  • Le plugin nginx n’est pas intégré par défaut à certbot. vous devez tout d’abord l’installer :
  • Partons du principe que vous disposiez déjà du virtual host suivant :
  • Générez votre certificat en remplaçant /var/www/html, mondomaine.com et www.mondomaine.com par vos informations :
  • Il vous sera demandé si vous souhaitez laisser l’accès à la fois HTTP et HTTPS ou forcer toutes les requêtes en HTTPS :

La configuration est terminée ! Rendez-vous désormais sur votre site désormais en HTTPS !

Sachez simplement qu’en arrière plan, Let’s Encrypt a modifié votre virtual host où l’emplacement de vos certificats et de votre clé privée a été spécifié. Il inclut aussi un fichier /etc/letsencrypt/options-ssl-nginx.conf qui permet de configurer SSL pour Nginx (l’algorithme de chiffrage, le type de clé supportée, etc.). Si la configuration proposée par défaut ne vous convient pas, vous pouvez évidemment modifier le virtual host.

Exemple de configuration modifiée si vous avez choisi l’option 1 (accepter à la fois les requêtes HTTP et HTTPS) :

Exemple de configuration modifiée si vous avez choisi l’option 2 (forcer toutes les requêtes en HTTPS) :

Let’s Encrypt aura généré automatiquement 4 fichiers dans le répertoire /etc/letsencrypt/live/mondomaine.com :

  • cert.pem : le certificat de votre domaine mondomaine.com
  • chain.pem : le certificat Let’s Encrypt
  • fullchain.pem : les certificats cert.pem et chain.pem combinés
  • privkey.pem : la clé privée du certificat.

3 – Améliorer la sécurité du protocole SSL/TLS (pour Nginx uniquement)

SSL/TLS utilise un système de chiffrement asymétriques (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS.

Pour les utilisateurs du serveur Apache, cette manipulation n’est plus nécessaire depuis la version 2.4.7 car, depuis celle-ci, Apache utilise une clé plus complexe.

  • Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions :
  • Modifiez votre virtual host en ajoutant la directive ssl_dhparam :
  • Redémarrez votre Nginx :
  • Rendez-vous sur SSL Labs et testez la sécurité de votre configuration SSL/TLS !

4 – Renouvellement d’un certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. L’outil certbot fournit une option renew permettant de renouveler l’ensemble des certificats présents sur votre serveur si et seulement si ceux-ci expirent dans moins de 30 jours.

Nous allons créer une règle crontab où le script de renouvellement sera planifié pour exécution tous les lundis à 23h42. Les traces liées à l’exécution du script seront enregistrées dans un fichier /var/log/certbot-renew.log.

  • Éditez la crontab :
  • Ajoutez la ligne suivante :
    • Si vous utilisez le plugin webroot, manual, nginx ou apache :
    • Si vous utilisez le plugin standalone, le serveur doit être arrêté avant le renouvellement du certificat (modifiez nginx en fonction de votre serveur) :
  • Sauvegardez et quittez.

5 – Révocation d’un certificat

Pour révoquer un certificat, il est nécessaire d’exécuter la commande suivante en remplaçant /etc/letsencrypt/live/mondomaine.com/cert.pem par votre domaine ou sous-domaine :


Ubuntu 16.04.2 Server LTS (64bits)Nginx 1.12.2
Certbot 0.21.0

AuteurEdouard WATTECAMPS

1 réponse
  1. Tibo
    Tibo dit :

    Bonjour,

    Ce message pour vous remercier pour ce tuto. J’ai lu et essayé un certain nombre de tuto sans succès avant de tomber sur le votre.
    J’ai des connaissances en linux plus que limitées mais grace à votre tuto, j’ai pu sécuriser mon reverse proxy nginx avec un certificat let’s encrypt en lieu et place du certificat auto-signé que j’utilisais jusqu’à maintenant.

    Encore merci.

    Répondre

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *