Automatiser Let's Encrypt sur un serveur Cloud avec acme.sh
L’autorité de certification Let’s Encrypt offre la possibilité d’obtenir des certificats TLS/SSL gratuitement et automatiquement pour les serveurs. Un inconvénient de Let’s Encrypt est la durée de validité relativement courte des certificats. Cet inconvénient peut être compensé par l’utilisation d’un logiciel qui renouvelle automatiquement les certificats sur le serveur. Un logiciel approprié pour cela est acme.sh. Dans cet article, nous montrons, à titre d’exemple, comment configurer acme.sh sur un serveur Cloud ###COMPANY-NAME### en combinaison avec Apache ou Nginx en tant que serveur web. acme.sh fonctionne avec des outils système Linux standard et est essentiellement un script Shell. En alternative à acme.sh, il existe “certbot”, qui nécessite Python mais offre plus de confort. Dans cet article séparé est décrite l’installation de certbot.
Conditions préalables
Vous disposez d’un serveur Cloud hosting.fr ayant une entrée DNS valide, par exemple
mustermann-domain.de.Le système d’exploitation du serveur est une version récente de Debian ou Ubuntu.
Installation d’Apache ou de Nginx
Dans ce guide, vous pouvez utiliser soit Apache, soit Nginx comme serveur web. Si vous devez utiliser Apache, veuillez l’installer avec les commandes suivantes, si cela n’est pas déjà fait :
apt update
apt install apache2
Pour Nginx, remplacez le package apache2 par le package nginx.
Pour que le serveur soit accessible depuis Internet, les ports 80 et 443 doivent être ouverts dans le pare-feu.
Installation d’acme.sh
Le script acme.sh peut être installé avec la commande suivante :
curl https://get.acme.sh | sh
Cela nécessite des droits root si vous souhaitez utiliser les autres commandes proposées dans ce guide. Après l’exécution de la commande, veuillez redémarrer votre shell actuel. Si vous utilisez bash, tapez bash. Si vous utilisez zsh, tapez zsh. Ensuite, la commande acme.sh sera disponible dans votre shell par défaut.
Un exemple de configuration pour Apache
Pour demander un certificat, la commande suivante peut être utilisée en mode Apache :
acme.sh --issue --apache -d mustermann-domain.de
Le paramètre -d spécifie le nom de domaine pour lequel vous souhaitez demander un certificat. Il est également possible de spécifier plusieurs domaines avec plusieurs paramètres -d. Les certificats reçus seront déposés dans le répertoire personnel de l’utilisateur courant sous ~/.acme.sh/ dans un sous-répertoire dédié au domaine respectif.
Un répertoire doit être créé où les certificats pour Apache seront stockés, par exemple :
mkdir /etc/apache2/ssl/
Ensuite, vous pouvez installer les certificats dans le nouveau répertoire avec acme.sh :
acme.sh --install-cert -d mustermann-domain.de \
--cert-file /etc/apache2/ssl/mustermann-domain.de-cert.pem \
--key-file /etc/apache2/ssl/mustermann-domain.de-key.pem \
--fullchain-file /etc/apache2/ssl/letsencrypt.pem \
--reloadcmd "systemctl reload apache2"
Ensuite, la configuration du serveur web Apache doit être modifiée pour qu’elle utilise les certificats. Pour cela, veuillez supprimer tous les fichiers et liens symboliques dans le répertoire /etc/apache2/sites-enabled/ pour une installation Debian fraîche :
rm /etc/apache2/sites-enabled/*
Vous pouvez ensuite créer le fichier /etc/apache/sites-available/mustermann.conf avec le contenu suivant :
# cette configuration nécessite mod_ssl, mod_socache_shmcb, mod_rewrite et mod_headers
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mustermann-domain.de-cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/mustermann-domain.de-key.pem
SSLCertificateChainFile /etc/apache2/ssl/letsencrypt.pem
# activer HTTP/2, si disponible
Protocols h2 http/1.1
# HTTP Strict Transport Security (mod_headers est requis) (63072000 secondes)
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
# configuration intermédiaire, ajustez selon vos besoins
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
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Pour cette configuration, le module headers dans Apache est nécessaire. Celui-ci peut être activé avec la commande
a2enmod ssl socache_shmcb rewrite headers
La nouvelle configuration doit être activée dans Apache avec la commande suivante :
a2ensite mustermann
Un exemple de configuration pour nginx
Pour demander un certificat en utilisant le serveur web nginx, vous pouvez utiliser la commande suivante, analogue à Apache :
acme.sh --issue --nginx -d mustermann-domain.de
Un répertoire doit être créé où les certificats pour Nginx seront stockés, par exemple :
mkdir /etc/nginx/ssl/
Ensuite, vous pouvez installer les certificats dans le nouveau répertoire avec acme.sh :
acme.sh --install-cert -d mustermann-domain.de \
--cert-file /etc/nginx/ssl/mustermann-domain.de-cert.pem \
--key-file /etc/nginx/ssl/mustermann-domain.de-key.pem \
--fullchain-file /etc/nginx/ssl/letsencrypt.pem \
--reloadcmd "systemctl reload nginx"
Ensuite, la configuration de nginx doit être ajustée pour utiliser les certificats demandés. Pour cela, veuillez supprimer tous les fichiers et liens symboliques dans /etc/nginx/sites-enabled pour une installation Debian fraîche :
rm /etc/nginx/sites-enabled/*
Créez ensuite le fichier /etc/nginx/sites-available/mustermann.conf. Une version simple pourrait ressembler à cela :
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
root /var/www/html;
ssl_certificate /etc/apache2/ssl/letsencrypt.pem;
ssl_certificate_key /etc/nginx/ssl/mustermann-domain.de-key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # environ 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains;";
ssl_stapling on;
ssl_stapling_verify on;
}
Créez ensuite un lien symbolique vers le fichier de configuration dans le répertoire /etc/nginx/sites-enabled :
cd /etc/nginx/sites-enabled/
ln -s ../sites-available/mustermann.conf
Enfin, redémarrez nginx pour activer la configuration :
systemctl restart nginx.service
Test
Pour tester les certificats configurés dans les serveurs web, vous pouvez utiliser le test Qualys SSL Labs. Un score de “A+” doit être atteint.
Les certificats Let’s Encrypt sont valables 90 jours. Les certificats seront automatiquement renouvelés par acme.sh tous les 60 jours. Nous recommandons de le vérifier au moins une fois tous les 60 jours.