Depuis quelques jours, on peut naviguer sur ce blog en https, en version TLS 1.2. Au départ, j'avais oublié de créer un certificat pour mon sous-domaine static qui me sert à livrer les fichiers statiques, en particuler les images. Du coup la page n'était pas considérée comme sûre par la plupart des navigateurs car le contenu était mixte : page en https mais certaines ressources en http (sans le s).
Les certificats délivrés par Let's Encrypt ne sont valides que 90 jours. Il faut donc penser à les renouveler. Comme je ne suis pas une machine, je vais forcément oublier et donc j'ai ajouté une tâche automatique pour faire ça automatiquement. Ma tache est lancé tous les jours et je renouvelle le certificat s'il a moins de 30 jours.
J'ai cloné et installé le dépôt d'outils fourni par Let's Encrypt et j'ai mis la configuration de mon certificat dans un fichier .ini qui ressemble à ça :
domains = www.nikrou.net,static.nikrou.net
rsa-key-size = 4096
server = https://acme-v01.api.letsencrypt.org/directory
email = YOUR_MAIL@YOUR.DOMAIN
authenticator = webroot
webroot-path = PATH/TO/DOCUMENTROOT
Je peux alors lancer la mise à jour de mon certificat en faisant simplement :
$ ./letsencrypt-auto -c path/to/cli.ini
Du coup pour que la mise à jour se fasse automatiquement, il suffit de créer une nouvelle entrée dans le répertoire /etc/cron.daily avec le contenu suivant, par exemple :
#!/bin/sh
DAY_LIMIT=30
TIMESTAMP_LIMIT=$(($DAY_LIMIT*86400))
OPENSSL=/usr/bin/openssl
SSL_PEM=PATH_TO_PEM_CERTIFICATE
MAIL=/usr/bin/mail -s "[ssl] Update" YOUR_EMAIL@YOUR.DOMAIN
PATH_LETSENCRYPT=PATH_TO_LETSENCRYPT_INSTALLATION
if $OPENSSL x509 -checkend $TIMESTAMP_LIMIT -noout -in $SSL_PEM
then
echo "Certificate is valid for more than $DAY_LIMIT days. Do not update." | $MAIL
else
cd $PATH_LETSENCRYPT && ./letsencrypt-auto -c /etc/letsencrypt/cli.ini
if [ $? -ne 0 ];then
echo "Something goes wrong. Cannot update ssl certificate. Need to validate it manually" | $MAIL
else
echo "Certificate has been updated" | $MAIL
fi
fi
exit 0
Il faut renseigner l'adresse mail, le chemin vers votre certificat (fichier PEM) et le répertoire où letsencrypt est installé. Il ne faut pas oublier de rendre ce fichier exécutable. J'ai créé un dépôt git avec ce script si vous avez des corrections ou des idées d'amélioration.
1 De Franck -
Question sur ton script : pourquoi envoyer un mail même quand il n'y a rien à faire (certif valide plus de 30 jours) ?
Du coup, pourquoi cron.daily, un cron.monthly ne suffirait pas ?
2 De Nicolas -
La raison de l'envoi du mail pour tous les cas, c'est en phase de mise au point du script. Effectivement je pourrais ne pas envoyer de mail quand il n'y a rien à faire.
Pour le fait de le mettre dans cron.daily c'est pour me prémunir du fait que par exemple la mise à jour peut échouer. Le certificat étant valide 90 jours, cela me laisse pas mal de jours pour réessayer.
Après comme je le disais, c'est un premier jet. C'est améliorable.
3 De Franck -
Ok, je comprends mieux.
J'ai lu attentivement la doc là-bas, et je me demandais pourquoi tu avais cloné le dépôt. Récupérer letecnrypts-auto.sh ne suffit pas ?
PS : Ton « Se souvenir de moi sur ce blog » ne fonctionne pas entre la prévisu et l'envoi.