Let’s Encrypt propose un client pour la mise en place et le renouvellement des certifications mais celui-ci doit avoir les droits root sur le serveur et il modifie la configuration du serveur web automatiquement.
Il existe beaucoup d’alternatives, celle que nous allons utiliser est un script shell nommé dehydrated.
Cet article est une traduction adaptée de Simple Let’s Encrypt on Debian/Apache publié par Andreas Gohr, merci à lui pour l’article original.
Pré-requis Apache
Activer le mod ssl :
- a2enmod ssl
- service apache2 restart
Si on souhaite utiliser https sur plusieurs domaines hébergés par la machine, ne pas oublier d’ajouter la ligne NameVirtualHost *:443
dans /etc/apache2/ports.conf
.
Installer et configurer dehydrated
Récupérez les sources de l’outil pour l’installer dans /etc/
:
- cd /etc/
- git clone https://github.com/lukas2511/dehydrated letsencrypt
- cd letsencrypt
Créez un répertoire .acme-challenges
qui permettra à l’émetteur du certificat de vérifier que les domaines à traiter vous appartiennent bien (ce répertoire doit donc être accessible à Apache).
- mkdir .acme-challenges
- echo 'it works' > .acme-challenges/test.txt
- chown -R www-data:www-data .acme-challenges
Créez un alias pour que le répertoire .acme-challenges
soit accessible pour chacun des domaines à traiter.
Apache 2.2
- # /etc/apache2/conf.d/letsencrypt
- Alias /.well-known/acme-challenge /etc/letsencrypt/.acme-challenges
- <Directory /etc/letsencrypt/.acme-challenges>
- Options None
- AllowOverride None
- Order allow,deny
- Allow from all
- </Directory>
- service apache2 reload
Apache 2.4
- # /etc/apache2/conf-available/letsencrypt.conf
- Alias /.well-known/acme-challenge /etc/letsencrypt/.acme-challenges
- <Directory /etc/letsencrypt/.acme-challenges>
- Options None
- AllowOverride None
- Require all granted
- </Directory>
- a2enconf letsencrypt
- service apache2 reload
Vous pouvez vérifier que le répertoire est bien accessible en adaptant l’url suivante à votre domaine http://geodiversite.net/.well-known/acme-challenge/test.txt
Créez un fichier de configuration minimal pour le script afin de définir votre adresse email et l’emplacement du répertoire .acme-challenges
:
- # /etc/letsencrypt/config
- CONTACT_EMAIL=admin@site.bb
- WELLKNOWN="${BASEDIR}/.acme-challenges"
Pour finir, créez le fichier qui listera les domaines à traiter. Chaque ligne correspond à un domaine et ses alias :
- # /etc/letsencrypt/domains.txt
- geodiversite.net www.geodiversite.net
Création et renouvellement de certificat
Pour créer ou renouveler les certificats des domaines, utilisez la commande suivante :
- ./dehydrated -c
- # INFO: Using main config file /etc/letsencrypt/config
- + Generating account key...
- + Registering account key with letsencrypt...
- Processing geodiversite.net with alternative names: www.geodiversite.net
- + Signing domains...
- + Creating new directory /etc/letsencrypt/certs/geodiversite.net ...
- + Generating private key...
- + Generating signing request...
- + Requesting challenge for geodiversite.net...
- + Requesting challenge for www.geodiversite.net...
- + Responding to challenge for geodiversite.net...
- + Challenge is valid!
- + Responding to challenge for www.geodiversite.net...
- + Challenge is valid!
- + Requesting certificate...
- + Checking certificate...
- + Done!
- + Creating fullchain.pem...
- + Done!
Si tout se passe bien comme ci-dessus, les certificats sont créés dans le répertoire /etc/letsencrypt/certs/
. Il ne reste plus qu’à configurer Apache pour qu’il les utilise.
Voici un exemple de configuration pour debian stretch à placer dans le virtualhost de chaque domaine (geodiversite.net dans notre cas). Vous pouvez utiliser l’outil fourni par Mozilla pour générer une configuration adaptée à vos besoins.
- <VirtualHost *:443>
- # ...
- SSLEngine On
- SSLCertificateFile /etc/letsencrypt/certs/geodiversite.net/fullchain.pem
- SSLCertificateKeyFile /etc/letsencrypt/certs/geodiversite.net/privkey.pem
- SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
- SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
- SSLHonorCipherOrder off
- SSLSessionTickets off
- Header always set Strict-Transport-Security "max-age=63072000"
- # Optimisations optionnelles cf https://observatory.mozilla.org/
- Header always set X-Content-Type-Options "nosniff"
- Header always set X-XSS-Protection "1; mode=block"
- </VirtualHost>
Il ne reste plus qu’à mettre en place le renouvellement automatique des certificats et s’assurer qu’Apache recharge sa configuration à ce moment.
Créez un fichier /etc/letsencrypt/hook.sh
.
- #!/bin/bash
- if [ ${1} == "deploy_cert" ]; then
- echo " + Hook: Restarting Apache..."
- service apache2 reload
- else
- echo " + Hook: Nothing to do..."
- fi
Rendez celui-ci exécutable et renseignez-le dans le fichier de configuration.
- chmod 755 hook.sh
- echo 'HOOK="${BASEDIR}/hook.sh"' >> config
Pour finir, ajoutez une tâche CRON dans /etc/cron.daily/letsencrypt
pour l’exécuter quotidiennement (sans oublier de la rendre exécutable).
- #!/bin/sh
- /etc/letsencrypt/dehydrated -c -g >> /var/log/letsencrypt.log 2>&1
Vous pouvez tester son bon fonctionnement en appelant /etc/cron.daily/letsencrypt
.