Présentation
Depuis quelques annĂ©es maintenant, il est possible de bĂ©nĂ©ficier d’un certificat SSL gratuitement par l’intermĂ©diaire de Let’s Encrypt. Cette autoritĂ© de certification publie des certificats reconnus par les navigateurs. Les certificats dĂ©livrĂ©s sont valables pour une durĂ©e de 90 jours mais il est facile de mettre en place un renouvellement automatique pour Ă©viter tout dĂ©sagrĂ©ment.
Dans ce tutoriel, nous allons effectuer une demande de certificat Let’s Encrypt et l’intĂ©grer sur un site sous Apache, le tout sous Debian. On s’appuiera sur l’outil certbot.
Installation des dépendances et de certbot
Commencez par installer des dépendances sur votre serveur :
sudo apt-get update sudo apt-get install software-properties-common
Pour l’installation du paquet « python-certbot-apache« , on va aller piocher dans les paquets backports de Debian Stretch. Ceci nous permettra d’avoir une version encore plus rĂ©cente du paquet. J’ai utilisĂ© cette mĂ©thode pour l’installation car sinon j’obtenais une erreur de Python lors de l’utilisation de certbot.
Cette mĂ©thode implique d’ajouter une source de paquets supplĂ©mentaire :
sudo vim /etc/apt/sources.list
Intégrez cette ligne au fichier sources.list :
deb http://ftp.debian.org/debian stretch-backports main
On va procĂ©der Ă l’actualisation des paquets et Ă l’installation du paquet python-certbot-apache Ă partir du dĂ©pĂŽt que l’on a renseignĂ© prĂ©cĂ©demment. Voici la commande Ă utiliser :
sudo apt-get update sudo apt-get install python-certbot-apache -t stretch-backports
Demander un certificat avec certbot
Lorsque l’installation sera terminĂ©e, nous allons utiliser Certbot pour effectuer une demande de certificat.
Un challenge se dĂ©clenche pendant la demande de certificat pour vĂ©rifier que la demande est valide et le site web bien disponible sur Internet. Pour que certbot utilise son propre serveur web intĂ©grĂ©, on va utiliser l’option « –standalone« . On va ensuite lui indiquer, via l’option « –preferred-challenges« , de faire son challenge sur le port 80 avec la valeur http ou 443 pour HTTPS avec la valeur tls-sni. Enfin, on va devoir prĂ©ciser le domaine pour lequel on effectue la demande de certificat, ceci s’effectue via l’option « -d« .
Voici un exemple de commande pour le domaine « www.mon-domaine.fr » :
sudo certbot certonly --standalone --preferred-challenges http -d www.mon-domaine.fr /!\ Attention si vous rencontrez l'erreur : Problem binding to port 80: Could not bind to IPV4 or IPV6 ArrĂȘter le service Apache puis relancer la commande systemctl stop apache2
Pendant le processus de demande de certificat, vous devrez indiquer une adresse e-mail. Celle-ci est notamment utilisée pour vous avertir lorsque le certificat arrive bientÎt à expiration.
Maintenant, on a en notre possession les fichiers nĂ©cessaires Ă la mise en place du certificat SSL. Ces fichiers se situent Ă l’emplacement suivant : /etc/letsencrypt/live/<votre-domaine>/
Vous y trouverez trois fichiers : cert.pem, privkey.pem et chain.pem.
Configurer le vhost d’Apache
Il faut que l’on adapte notre VirtualHost Apache du site SSL pour intĂ©grer le chargement des fichiers du certificat. Il est nĂ©cessaire d’utiliser cinq options diffĂ©rentes, comme on le ferait avec tout certificat SSL.
Voici les lignes à intégrer au vHost (adaptez le chemin selon votre domaine) :
SSLEngine on SSLProtocol all -SSLv2 SSLCertificateFile /etc/letsencrypt/live/www.mon-domaine.fr/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/www.mon-domaine.fr/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/www.mon-domaine.fr/chain.pem
Enregistrez la configuration.
Activez le module SSL sur Apache avec la commande suivante :
sudo a2enmod ssl
Enfin, si besoin, activez votre site Apache SSL. Par exemple, si le fichier de configuration du vHost se nomme « www.mon-domaine.fr » :
sudo a2ensite www.mon-domaine.fr.conf
Pour passer en production cette nouvelle configuration, nous allons recharger Apache :
sudo systemctl reload apache2
Pour terminer, nous allons automatiser le renouvellement du certificat avec un script en tùche planifiée.
Renouvellement via certbot
On va créer un fichier sh contenant notre script :
nano /usr/bin/certbot-renew.sh
Comme il s’agit d’un script, le fichier doit ĂȘtre exĂ©cutable, on ajoute ce droit :
chmod +x /usr/bin/certbot-renew.sh
Enfin, voici le contenu du script qui va simplement exĂ©cuter le binaire certbot avec l’option renew.
Un fichier de log sera généré au chemin /var/log/certbot-renew.log« .
#!/bin/bash cd /usr/bin ./certbot renew >> /var/log/certbot-renew.log service apache2 reload exit 0
Pour lancer automatiquement le script, on va éditer la crontab (gestion des tùches planifiées) :
crontab -e
L’exemple ci-dessous permet d’exĂ©cuter l’action de renouvellement tous les jours Ă 05 heures du matin. Le certificat sera renouvelĂ© si nĂ©cessaire et non tous les jours.
Ce qui donne :
0 5 * * * /usr/bin/certbot-renew.sh
Il ne reste plus qu’Ă enregistrer la crontab.
Renouvellement dâun certificat letâs encrypt & redirection de port
certbot-renews.sh ou sudo certbot renew
Si vous avez plusieurs certificats pour différents domaines et que vous souhaitez renouveler un certificat spécifique, utilisez :
certbot certonly --force-renew -d example.com
Cas d’erreur :
Failed to renew certificate mon.site.com with error: Problem binding to port 80: Could not bind to IPv4 or IPv6. All renewals failed. The following certificates could not be renewed: /etc/letsencrypt/live/mon.site.com/fullchain.pem (failure) 1 renew failure(s), 0 parse failure(s)
Pour renouveler le certificat SSL vous devez désactiver apache le temps de lancer la commande :
systemctl stop apache2 certbot-renews.sh systemctl start apache2
Autre possibilité :
- vérifier les rÚgles de votre pare-feu et le port forward
- vérifier si le port 80 est bien configurer dans le fichier /etc/apache2/ports.conf
- vérifier si le port 80 est bien configurer dans /etc/apache2/sites-available/votre.site.conf
Pour vérifier que le certificat a été renouvelé, exécutez :
sudo certbot renew --dry-run