Pierre-Alain Bandinelli : Letsencrypt : renouveler intelligemment malgré les limites de la bêta
lundi 1 février 2016 à 06:36Letsencrypt se présente comme le futur du chiffrement sur internet. Bien que déjà fonctionnel, le service offert est encore en phase de test (bêta) et par conséquent certaines contraintes s'appliquent aux usagers testeurs. Parmi ces contraintes, les 2 les plus bloquantes sont :
- pas de système de renouvellement automatique pour le moment (c'est prévu, vivement !)
- limite imposée de 5 certificats par domaine par semaine (i.e. qu'il faut attendre une semaine pour pouvoir créer des certificats pour un nouveau sous-domaine d'un domaine qui possède déjà 5 certificats de sous-domaine)
Pour Letsencrypt qui émet des certificats à la validité courte de 3 mois, le renouvellement doit être fait régulièrement et il correspond ni plus ni moins à l'édition d'un nouveau certificat.
La contrainte évoquée plus haut est bloquante pour le renouvellement : en effet il n'est pas possible de renouveler plus de 5 certificats par semaine pour un même domaine...
Principe du renouvellement à terme
A terme, un système de renouvellement automatique sera intégré à Letsencrypt et il suffira de lancer tous les 2 mois (par exemple via cron) la commande demandant le renouvellement de tous les certificats en approche de péremption. Vivement cela !
Une méthode fonctionnelle aujourd'hui
Aujourd'hui, à nous de créer l'automatisme qui va bien et qui permettra aussi de contourner la limite des 5 renouvellements par semaine (en réalisant un roulement). Nous allons détailler ici un script qui, appelé chaque semaine, :
- détecte les certificats plus vieux que 50 jours
- demande le renouvellement de chaque certificat dans ce cas
Voici le code du script :
#!/bin/bash declare -a list=( "/etc/letsencrypt/live/domaine1.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/domaine1/website -d domaine1.tld -d www.domaine1.tld" "/etc/letsencrypt/live/sous.domaine1.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/sous/domaine1/website -d sous.domaine1.tld -d www.sous.domaine1.tld" "/etc/letsencrypt/live/domaine2.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/domaine2/website -d domaine2.tld -d www.domaine2.tld" ) for line in "${list[@]}" do IFS=";" read -ra stuff <<< $line folder=${stuff[0]} command=${stuff[1]} timesincelastchange=$(expr $(expr $(date +%s) - $(date +%s -r $folder/fullchain.pem )) / 86400) if [ $timesincelastchange -gt 50 ] then $command echo "Done for $folder" else echo "Nothing to do for $folder" fi done
Rapidement :
- on commence par lister dans un tableau chaque domaine dont il faut s'occuper (en indiquant le chemin correspondant à ce domaine dans le dossier /etc/letsencrypt/live/) et, séparée par ";", la commande Letsencrypt utilisée pour le renouvellement. Il s'agit de la même commande que pour la création initiale du certificat sauf que l'on ajoute l'option "--renew-by-default"
- on parcourt ensuite le tableau élément par élément :
- en vérifiant l'âge du certificat (date de dernière modification du fichier)
- en lançant la commande de renouvellement s'il est trop "vieux"
Si l'on utilise Letsencrypt avec Pound, on ajoutera 2 actions :
- remplacer le fichier .pem utilisé par Pound par la nouvelle version obtenue
- redémarrer Pound
Le script devient alors :
#!/bin/bash declare -a list=( "/etc/letsencrypt/live/domaine1.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/domaine1/website -d domaine1.tld -d www.domaine1.tld" "/etc/letsencrypt/live/sous.domaine1.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/sous/domaine1/website -d sous.domaine1.tld -d www.sous.domaine1.tld" "/etc/letsencrypt/live/domaine2.tld;/opt/letsencrypt/letsencrypt-auto certonly --renew-by-default -a webroot --webroot-path /path/to/domaine2/website -d domaine2.tld -d www.domaine2.tld" ) for line in "${list[@]}" do IFS=";" read -ra stuff <<< $line folder=${stuff[0]} command=${stuff[1]} timesincelastchange=$(expr $(expr $(date +%s) - $(date +%s -r $folder/fullchain.pem )) / 86400) if [ $timesincelastchange -gt 50 ] then $command rm -f $folder/total.pem cat $folder/fullchain.pem $folder/privkey.pem > $folder/total.pem echo "Done for $folder" else echo "Nothing to do for $folder" fi done service pound restart
Original post of Pierre-Alain Bandinelli.Votez pour ce billet sur Planet Libre.
Articles similaires
- Pierre-Alain Bandinelli : Obtenir une bonne note chez SSLLabs avec Pound (10/11/2014)
- Pierre-Alain Bandinelli : Utiliser Let’s Encrypt avec ownCloud, Piwik, Dotclear, Drupal, Wordpress, des applications Rails et des sites statiques ! (19/12/2015)
- Pierre-Alain Bandinelli : Let's Encrypt et le load-balancer Pound (20/12/2015)
- Pierre-Alain Bandinelli : Forcer la bascule vers HTTPS derrière un 'reverse proxy' (18/10/2013)
- Pierre-Alain Bandinelli : Se maintenir au top de la sécurité SSL/TLS en faisant le ménage sur sa suite de chiffrements (cipher suite) (10/03/2015)