Let's Encrypt

Ubuntu – Installation et génération de certificats avec Let’s Encrypt

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé 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 avril 2016, Let’s Encrypt a livré 1,7 million de certificats pour 3,8 millions de sites Web.

1 – Installation

Les versions d’Ubuntu antérieures à la version 16.04 ne contiennent pas Let’s Encrypt dans le gestionnaire de paquets. En revanche, la version 16.04 d’Ubuntu contient le paquet Let’s Encrypt dans les sources officiels, un simple « sudo apt-get install letsencrypt » s’avèrerait suffisant. Cependant nous déconseillons de passer par le gestionnaire de paquets d’Ubuntu car celui-ci ne contient pas la dernière version de Let’s Encrypt.

Let’s Encrypt met à disposition un dépôt Git permettant de récupérer une copie de la dernière version de Let’s Encrypt. Le projet contient un script letsencrypt-auto qui, à son exécution, installera automatiquement toutes les dépendances liées à Let’s Encrypt (contrairement au paquet des sources officiels d’Ubuntu). De plus, à chaque génération/renouvellement de certificats avec le script letsencrypt-auto, Let’s Encrypt sera automatiquement mis à jour.

  • Mettez à jour votre gestionnaire de paquets :
  • Il est nécessaire d’installer l’outil git pour récupérer les sources de Let’s Encrypt :
  • Téléchargez le client Let’s Encrypt dans le dossier /opt/letsencrypt :
  • Lancez l’installation :

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. Ces plugins mettent à jour automatiquement la configuration des virtual hosts mais le plugin Nginx est encore expérimental. Dans cet article, nous recommandons d’utiliser le plugin webroot pour Nginx qui permet de renouveler son certificat sans interrompre le serveur Nginx. Côté Apache, le plugin apache est mâture et simplifie amplement la tâche.

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 votre provider.

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 [email protected], 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 :

    • --standalone-supported-challenges http-01 pour utiliser le port 80
    • --standalone-supported-challenges tls-sni-01 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
    • access_log : fichier de journalisation des accès à votre domaine
    • error_log : fichier de journalisation des erreurs liées à votre domaine
    • 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 (recommandé pour un serveur web Nginx)

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, [email protected] 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
    • access_log : fichier de journalisation des accès à votre domaine
    • error_log : fichier de journalisation des erreurs liées à votre domaine
    • 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/letsencrypt/acme/mondomaine.com, [email protected] 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
    • access_log : fichier de journalisation des accès à votre domaine
    • error_log : fichier de journalisation des erreurs liées à votre domaine
    • 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 [email protected], mondomaine.com et www.mondomaine.com par vos informations :

  • Un écran de validation s’affiche à propos de l’adresse IP utilisée pour effectuer la demande de certificat. Validez en appuyant sur la touche Entrée :
    Let's Encrypt - manual
  • 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é Q5yhIWfvOCCf87nsq_PRvcWlTvRBSVsx4_B5HttJktE.m81327mDvpfznf3V9mZ7RHNCrag0hmpJ9ZK1FEt8IjE par votre propre clé générée par Let’s Encrypt ainsi que le nom du fichier Q5yhIWfvOCCf87nsq_PRvcWlTvRBSVsx4_B5HttJktE :

  • 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
    • access_log : fichier de journalisation des accès à votre domaine
    • error_log : fichier de journalisation des erreurs liées à votre domaine
    • 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 (recommandé pour un serveur web Apache)

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

Partons du principe que vous disposiez déjà du virtual host suivant écoutant sur le port 80 :

  • Vous devez tout d’abord 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 :
    Let's Encrypt - Plugin Apache

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), 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 mais celui-ci est à utiliser avec précaution car encore expérimental.

  • Le plugin nginx est encore expérimental et n’est pas intégré par défaut à letsencrypt-auto. vous devez tout d’abord l’installer (la llibrairie pip doit être à jour) :
  • Partons du principe que vous disposiez déjà du virtual host suivant :
  • 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 :
    Let's Encrypt - Plugin Nginx

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 :
  • Rechargez votre configuration 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. Let’s Encrypt fournit une option renew avec le script de génération de certificats letsencrypt-auto qui tentera de renouveler l’ensemble de vos certificats présents sur votre serveur si ceux-ci expirent dans moins de 30 jours. Pour cela, nous créerons 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/le-renew.log.

  • Éditez la crontab :
  • Ajoutez la ligne suivante :
  • Sauvegardez et quittez.

Si vous utilisez la méthode standalone, votre serveur web doit être arrêté avant le renouvellement de vos certificats. Pour cela, vous devrez suivre la démarche ci-dessous.


  • Créez le fichier letsencrypt-renew.sh dans /etc/sbin :

    Pour Nginx :

    Pour Apache :

  • Rendez le script letsencrypt-renew.sh exécutable :

  • Éditez la crontab :

  • Ajoutez la ligne suivante :

  • 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/www.mondomaine.com/cert.pem par votre domaine ou sous-domaine :


Ubuntu Server LTS (64bits)Nginx 1.9.12
Let’s Encrypt 0.5.0

Auteur
AuteurEdouard WATTECAMPS

0 réponses

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 *