======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.