Let's Encrypt est un Autorité de Certification qui est GRATUITE et qui permet de signer un certificat de façon automatique et quasi instantané.
Deux méthodes existent pour valider un certificat :
L'objectif de cette page est de générer et faire signer des certificats avec Let's Encrypt.
Cette méthode n'est pas la plus simple, mais elle permet de mettre en place DANE/TLSA et HPKP ainsi que d'avoir des certificats en ECC.
Pour cela, il faut juste le packet certbot/letsencrypt.
Cette méthode n'est pas éligible au renouvellement automatique de certbot, donc il faudra ajouter manuellement l'entrée en tache cron. La méthodologie, si suivie a la lettre, permet un gestion simple de ces certificats.
Pour chaque domaines, nous allons créer les dossiers où seront stocké les certificats et les clés:
# mkdir -p /etc/ssl/custom-certbot/{live,archive}/wiki.virtit.fr
puis on génère la clé privé:
# openssl ecparam -name prime256v1 -genkey -out /etc/ssl/custom-certbot/live/wiki.virtit.fr/privkey.pem
Puis le certificat publique
# openssl req -new -subj "/CN=wiki.virtit.fr" -key /etc/ssl/custom-certbot/live/wiki.virtit.fr/privkey.pem -nodes -out /etc/ssl/custom-certbot/live/wiki.virtit.fr/csr.pem
Ces certificats seront unique mais pensez à les renouveler de temps en temps .
Pour signer votre certificat, il faut lancer la commande suivante :
# certbot certonly --webroot -w /var/www/letsencrypt/ -d wiki.virtit.fr --csr /etc/ssl/custom-certbot/live/wiki.virtit.fr/csr.pem --cert-path /etc/ssl/custom-certbot/live/wiki.virtit.fr/cert.pem --chain-path /etc/ssl/custom-certbot/live/wiki.virtit.fr/chain.pem --fullchain-path /etc/ssl/custom-certbot/live/wiki.virtit.fr/fullchain.pem
Pour renouveler le certificat, j'ai créé un script qui va vérifier la date d'expiration, et renouvelle au besoin.
Je vous conseil d'ajouter la tâche cron suivante :
0 2 * * * root /opt/renew-cert.sh
et créer le script suivant :
#!/usr/bin/env bash PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" cd /etc/ssl/custom-certbot/live/ TEMP=`mktemp -d` NOW_SECONDS=`date '+%s'` NEEDTORELOAD=0 for i in * ; do END_DATE=`openssl x509 -dates -noout -in ${i}/cert.pem 2>/dev/null | sed -n 's/ *notAfter=*//p'` END_DATE_SECONDS=`date '+%s' --date "$END_DATE"` REMAINING_DAYS=`echo "($END_DATE_SECONDS-$NOW_SECONDS)/24/3600" | bc` if [ "$REMAINING_DAYS" -lt "30" ]; then NEEDTORELOAD=1 echo "Renewing $i" mkdir ${TEMP}/${i} /usr/bin/certbot certonly --webroot -w /var/www/letsencrypt/ -d $i --csr ${i}/csr.pem --cert-path ${TEMP}/${i}/cert.pem --chain-path ${TEMP}/${i}/chain.pem --fullchain-path ${TEMP}/${i}/fullchain.pem EXITCODE=$? if [ "$EXITCODE" -eq "0" ]; then if [ ! -d "/etc/ssl/custom-certbot/archive/${i}" ]; then mkdir /etc/ssl/custom-certbot/archive/${i} fi mv ${i}/cert.pem /etc/ssl/custom-certbot/archive/${i}/cert.pem mv ${i}/chain.pem /etc/ssl/custom-certbot/archive/${i}/chain.pem mv ${i}/fullchain.pem /etc/ssl/custom-certbot/archive/${i}/fullchain.pem mv ${TEMP}/${i}/* ${i}/ fi else if [ -t 1 ] ; then echo "Nothing to do on $i ($REMAINING_DAYS days left)" fi fi done if [ "$NEEDTORELOAD" -eq "1" ]; then echo "Reloading services" systemctl reload nginx fi rm -r $TEMP
Il faudra le rendre exécutable, et ajouter les commandes nécessaires au rechargement des services dans le script.