======Let's Encrypt======
====Comprendre Let's Encrypt====
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 :\\
- Par requête HTTP : Lors de la demande de certificat, l'API va effectuer une requête HTTP sur la dites URL dans le répertoire ///.well-known/acme-challenge// d'un fichier très spécifique qu'il aura demandé de créer lors de la dites requête.
- Par requêtes DNS : Lors de la requête, l'API fera une requête TXT particulière sur le DNS. Celle-ci n'est soit pas automatique ou elle oblige que le serveur WEB puissent mettre à jour sa zone DNS. Bien que plus contraignante, elle permet depuis la version 2 de signer des certificats WildCard.
====Pourquoi cette méthode====
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 [[kb:crypto:DANE_TLSA|DANE/TLSA]] et [[kb:crypto:HPKP]] ainsi que d'avoir des certificats en [[https://en.wikipedia.org/wiki/Elliptic-curve_cryptography |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.
====Génération du certificat====
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 :-).
====Signature du certificat====
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
====Renouvellement du certificat====
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.