Obtenir des certificats SSL Lets Encrypt sur CentOS

Le projet Let's Encrypt permet d'obtenir des certificats SSL non seulement gratuitement, mais aussi de gérer leur renouvellement de manière automatique. Let's Encrypt utilise un protocole standardisé pour la vérification du contrôle du domaine nommé ACME. Il existe plusieurs clients implémentant ce standard, l'un d'entre eux est letsencrypt.sh (écrit entièrement en shell).

Principe de fonctionnement

Le principe de fonctionnement est assez simple. Un client génère en local une pair clé privée/publique, en crée une CSR, et fait une requête aux serveurs de Let's Encrypt pour faire signer cette CSR (notez que la clé privée n'est pas envoyé vers Let's Encrypt, seule la partie publique l'est).

Let's Encrypt va ensuite demander au client de résoudre des challenges pour prouver qu'il est bien en contrôle du/des domaines pour lesquels le certificat est valide. Il existe plusieurs type de challenges différents, le plus simple est la méthode par http. Avec cette méthode, le serveur va demander de mettre à disposition un fichier avec un contenu particulier, sur une adresse précise. Par exemple, le client demande un certificat pour www.domaine.fr

Le serveur renvoi au client: “Met à disposition un fichier sur l'adresse http://www.domaine.fr/.well-known/acme-challenge/z_KYfE4e3HkMuubbWIXRFoCxGc78BDUuiePRINca6ZA un fichier contenant la chaîne ECDifanV40XTqiRTgOHbxu-eeMBM8ee6lnNvL2nIopw”

Le client dépose le fichier au bon endroit et indique au serveur qu'il s'est exécuté

Le serveur récupère ce fichier et vérifie son existence et son contenue

Ce sont les grandes lignes de fonctionnement, il y a d'autres détails, mais le principe est celui-ci

Installation du client

La première chose à faire est d'installer le client letsencrypt:

yum install letsencrypt.sh

Configuration

Plusieurs choses sont à configurer

Dans le fichier /etc/letsencrypt.sh/domains.txt il faut placer les noms pour lesquels le certificat sera valide. Pour chaque ligne contenu dans ce fichier, un certificat différent sera créé. On peut avoir plusieurs noms sur une même ligne, le certificat correspondant sera alors valide pour tous ces noms (y compris s'ils appartiennent à des domaines entièrement différents). Un certificat peut avoir jusqu'à 90 noms valides. Attention: pour chaque nom, les challenges devront être résolus

Dans le fichier /etc/letsencrypt.sh/config on règle le comportement global du client. La plupart est documentée, mais peut être généralement laissée par défaut.

Dans le fichier /etc/cron.daily/letsencrypt.sh on peut dé-commenter deux lignes pour automatiser le renouvellement du/des certificat(s) lorsqu'il reste moins de 30 jours de validité (valeur ajustable dans /etc/letsencrypt.sh/config)

Le répertoire /etc/letsencrypt.s/hooks_deploy_cert.d contient les scripts qui seront exécutés lors d'un renouvellement de certificat. C'est à cet endroits que l'on va créer nos script pour recharger les démons nécessaires. Un exemple est fournit pour recharger le démon httpd (mais il n'est pas actif par défaut). Les fichiers placé dans ce répertoire doivent être exécutables, sinon, ils seront ignorés. Ils seront exécutés par ordre alphabétique (classement ASCII)

Dans l'ordre, il faut généralement:

Éditer /etc/letsencrypt.s/domains.txt pour indiquer les domaines pour lesquels créer un certificat

Mettre en place les scripts dans /etc/letsencrypt.sh/hooks_deploy_cert.d/

demander manuellement le certificat la première fois

letsencrypt.sh -c

Une fois le certificat obtenu, il faut ajuster la configuration de nos démons pour utiliser les nouveaux certificats (/var/lib/letsencrypt.sh/certificates/cert/<nom de domaine>/)

Quand tout est fonctionnel, on a plus qu'à dé-commenter les lignes dans /etc/cron.daily/letsencrypt.sh pour automatiser le renouvellement (et la révocation des anciens certificats)

Les URL des challenges ACME doivent être accessibles librement (pas de restriction d'IP source, ni d'authentification), sans quoi les serveurs de Let's Encrypt ne pourront pas faire la vérification, et refuseront de signer le certificat
le fichier de configuration /etc/httpd/conf.d/letsencrypt.sh.conf rend les challenges accessibles pour le vhost par défaut. Il faudra s'assurer que si d'autres vhosts sont utilisés, les mêmes URI soient accessibles