Après avoir passé ce blog et d’autres sites web dont je gère en full HTTPS grâce à Let’s Encrypt, j’ai écrit un petit script bash pour automatiser le renouvellement de mes certificats 24h avant les 90 jours de limite de validité.
Mon petit script de renouvellement pour mes certificats Let’s Encrypt
Avant d’écrire le script d’automatisation de renouvellement, il faut passer par une étape de configuration en créant un fichier avec l’extension .ini pour chaque domaine (site web).
De plus, pour être notifié par mail pensez à configurer un MTA.
Configuration d’un fichier .ini pour chaque domaine
- Pour le domaine memo-linux.com :
nano /opt/letsencrypt/memo-linux.ini
rsa-key-size = 4096 email = admin@memo-linux.com domains = memo-linux.com,www.memo-linux.com,cdn-01.memo-linux.com,cdn-02.memo-linux.com text = True authenticator = standalone renew-by-default = True agree-tos = True
nano /opt/letsencrypt/autre-site.ini
rsa-key-size = 4096 email = admin@autre-site.tld domains = autre-site.tld,cdn.autresite.tld text = True authenticator = standalone renew-by-default = True agree-tos = True
Quelques explications :
- rsa-key-size : Chiffrement de la clé sur 4096bits.
- email : l’e-mail de destination pour être notifié du renouvellement.
- domains : le domaine ou sous domaine généré(s) avec ce certificat
- text : pour exécuter letsencrypt-auto uniquement en lignes de commandes.
- authenticator : méthode de vérification de l’identité du domaine.
- renew-by-default : comme les certificats existent déjà, on indique que c’est uniquement pour renouveler le certificat
- agree-tos : pour accepter les conditions d’utilisation de Let’s Encrypt
Attention, Let’s Encrypt limite la génération de 5 certificats par semaine (pour l’instant).
Mon script de renouvellement des certificats Let’s Encrypt
MAJ: script modifié, merci à Tetsumaki.
Avec cette modification, les certificats seront renouveler 24h avant la date d’expiration.
nano /home/fred/script/updatecrt.sh
#!/bin/sh
cd /opt/letsencrypt/
if ! openssl x509 -checkend 86400 -noout -in /etc/letsencrypt/live/memo-linux.com/cert.pem
then
systemctl stop nginx
/opt/letsencrypt/letsencrypt-auto certonly --config /opt/letsencrypt/memo-linux.ini
temoin=1
fi
if ! openssl x509 -checkend 86400 -noout -in /etc/letsencrypt/live/autre-site.tld/cert.pem
then
systemctl stop nginx
/opt/letsencrypt/letsencrypt-auto certonly --config /opt/letsencrypt/autre-site.ini
temoin=1
fi
if [[ $temoin ]];
then
systemctl start nginx
fi
Ne pas oublier de rendre exécutable le sript :
chmod +x /home/fred/script/updatecrt.sh
Planification de l’exécution du script
Pour ce faire, je vais utiliser crontab et configurer pour exécuter le script toutes les 24h
crontab -e
0 2 1 */2 * /home/fred/script/updatecert.sh
systemctl restart cron
Un grand merci pour ce script. Tu me fais sauver beaucoup de temps.
Salut, Jean-marc,
j’ai corrigé ton url ;-)
Hello,
Je trouve ça très dommage de générer le certificat de manière aléatoire comme tu le fais.
Le faire à ta façon signifie que le certificat sera généré tous les 2 mois à condition de ne pas redémarrer le serveur ou redémarrer la daemon cron, de plus le certificat est valide 3 mois, pourquoi donc faire comme ceci.
Il serait préférable de tester la validité du certificat en vérifiant le temps restant et donc de lancer la tâche cron tous les jours.
Par exemple comme ceci :
#!/bin/sh
if ! openssl x509 -checkend 86400 -noout -in /etc/letsencrypt/live/memo-linux/cert.pem
then
/opt/letsencrypt/letsencrypt-auto certonly –config /opt/letsencrypt/memo-linux.ini
temoin=1
fi
if ! openssl x509 -checkend 86400 -noout -in /etc/letsencrypt/live/autre-site/cert.pem
then
/opt/letsencrypt/letsencrypt-auto certonly –config /opt/letsencrypt/autre-site.ini
temoin=1
fi
if [[ $temoin ]];
then
systemctl reload nginx
fi
Avec un cron chaque jour à 03h03 par exemple :
3 3 * * * /home/fred/script/updatecert.sh
J’ai un peu simplifié le script mais c’est ma méthode, de cette façon tu génères un certificat si celui-ci expire dans moins de 86400 secondes (24h) et donc lancer le cron toutes les 24h est une bonne manière de faire afin de respecter des bonnes pratiques et ne pas solliciter les serveurs Let’s Encrypt inutilement.
Merci Tetsumaki,
effectivement en y réfléchissant un peu plus ta méthode est quand même sacrément plus propre. Je voulais faire simple mais pour le coup, c’était trop simple…
Petite question: est-ce que ça fonctionne sous ton user?
Ou le crontab se fait en root? ou avec www-data?
J’ai du mal à imaginer que ça puisse tourner avec un utilisateur non-privilégié (utilisation du port 80, re-démarrage de service,…)
le script est exécuté en tant que root
Yahallo,
Petite question également : j’ai bien installé mon certif’, tout allait bien, je touchais à rien (je me co’ plus au serveur quoi) et là, je vois mon https en rouge : « Le certificat du serveur n’est pas approuvé »
Je dois régénérer le certif’ ?
Merci d’avance x)
Salut illox,
est-ce que auparavant tu avais créé un certificat auto-signé ?
en tout cas, de mon côté aucun souci pour accéder à ton site en https…
Oui, apparemment certains parviennent à avoir le https en vert sans problème…
Me concernant, et concernant également d’autres personne, nous avons plus souvent le https en erreur (rouge) que vert… :/
Il y a-t-il une manipulation ou ça vient de Let’s Encrypt ?
A mon idée cela ne vient pas des let’s encrypt mais de ta conf, avec quel navigateur ou ça pose problème ?
Quel sont les cypher que tu as mis en place ?
Je n’ai pas encore mis les ciphers en place…
Je le fais ce W-E, tu as une recommandation à ce niveau ?
Merci d’avance x)
perso j’ai mis ceux là : EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
okay, thanks x)
Salut, à quoi sert text = True ?
text : pour exécuter letsencrypt-auto uniquement en lignes de commandes ;-)
Yahallo x)
J’ai régénéré mes certifs’ avec certonly… Mais je n’ai gagné que 8 jours…
Comment cela se fait-il ?
Merci d’avance x)
Bonjour et merci pour ce script
Par contre je dois l’avoir découvert un peu tard; Visiblement il ne fonctionne plus certainement suite à la dernière maj de Let’s Encrypt.
J’obtiens ce message en retour : « letsencrypt: error: unrecognized arguments: config /root/ssl/svnet.ini »
D’après de ce que j’en conclus, l’argument « -config » n’existerait plus
Bien Librement
Bonjour svnet,
arf, encore un problème de mise en forme du code, en fait c’est
--config
et non-config