====== certbot pour Let's Encrypt ======
{{ informatique:applications:pasted:20200507-002818.png?75x75|cerbot pour let's encrypt}}

**Certbot** est un binaire qui permet de mettre en œuvre un certificat SSL pour un domaine d'un site Internet.

Voici les actions a effectuer sur **Linux** **Debian 10**.

Depuis 2020, **certbot** est installé depuis **snapcraft**.

===== - Installer snap =====

Si vous n'avez pas encore installé **snap**, il faut executer les commandes suivantes dans un **terminal**. Les commandes doivent avoir une élevation des droits.

  sudo apt update
  sudo apt install snapd
  sudo snap install core

Si **snap** est déjà installé, assurez-vous d'être à jour :

  sudo snap refresh core
  


===== - Installer certbot =====

Exécutez la commande suivante oour installer **cerbot** sur votre machine. Ceci est a exéctuer dans un terminal.

  sudo snap install --classic certbot
  sudo ln -s /snap/bin/certbot /usr/bin/certbot


===== - Générer un certificat - gestion manuelle =====

Si vous suivez ce guide, je vous conseille une gestion manuelle de vos certificats.

Il y a deux variables :
^ dirWeb | Dossier des données du site. Pour habitude, c'est quelque chose du genre ''/var/www/html/'' |
^ siteName | Nom du site Internet. Par exemple ''abonnel.fr'' |

<code BASH>
read -p "Quel est votre nom de domaine ? " siteName
read -p "Dossier Web du site ? " dirWeb
sudo certbot certonly --webroot -w $dirWeb -d $siteName --register-unsafely-without-email
</code>

L'avantage de ce script :
  * pas d'arrêt d'Apache 2
  * pas de mail à saisir
  * autonomie sur la configuration Apache 2

Quelques **chemins** à retenir :

^ fichier de configuration  | /etc/letsencrypt/renewal/$siteName.conf  |
^ dossier archive | /etc/letsencrypt/archive/$siteName  |
^ fichier cert  | /etc/letsencrypt/live/$siteName/cert.pem  |
^ fichier privkey  | /etc/letsencrypt/live/$siteName/privkey.pem  |
^ fichier chain  | /etc/letsencrypt/live/$siteName/chain.pem  |
^ fichier fullchain  | /etc/letsencrypt/live/$siteName/fullchain.pem  |

Pour enregistrer un domaine principal avec et sans les **www**, il faut utiliser le script suivant :
<code BASH>
echo "Quel nom de domaine (avec www) ?"
read siteNameWww
echo "Quel nom de domaine (sans les www) ?"
read siteName
sudo certbot certonly --webroot -w /var/www/html/ -d $siteName -d $siteNameWww --register-unsafely-without-email
</code>

===== - Générer un certificat - gestion automatique =====

Si vous avez effectué le paragraphe précédent [[#generer-un-certificat-gestion-manuelle]], il est inutile de suivre les recommandations de ce chapitre.

Exécutez le commande suivant pour générer un certificat et édité votre configuration Apache de manière automatique. Le protocole **https** s'active de manière automatique, en une seule étape.

  sudo certbot --apache
  
  


===== - Renouveler les certificats automatiquement =====

Éditer la tâche des tâches Linux du compte ''root'', //crontab// :
<code>
sudo crontab -e
</code>

La tâche doit exécutée le programme ''certbot'' avec l'option de renouvellement, ''renew''. L'option ''post-hook'' permet d'indiquer la commande à exécuter après le traitement de ''certbot''. Dans notre cas, on demande à ''systemctl'' de recharger la configuration ''Apache 2''.

<code>
0 23 1-7 */2 4 python -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/bin/certbot renew --post-hook "systemctl reload apache2" >> /var/log/letsencrypt/renew.log
</code>

Explications :
<html><pre>
Tous les deux mois ( 0 23 1-7 <strong>*/2</strong> 4 )
à 23 heures ( <strong>0 23</strong> 1-7 */2 4 ),
le premier jeudi ( 0 0 <strong>1-7</strong> */2 <strong>4</strong> ),
lancement d'un script Python, qui retarde 1 heure au maximum (random.random() * 3600),
l’exécution de la mise à jour de certbot.
</pre></html>

Vous pouvez trouver d'autres informations sur la page [[https://crontab.guru/#0_23_1-7_*/2_4]]

===== - Afficher les dates du certificats =====

Pour afficher les dates de génération et d'expiration d'un certificat en local sur un serveur :

<code>
sudo ls /etc/letsencrypt/live/
read -p "Quel est votre nom de domaine ?" siteName
sudo openssl x509 -noout -dates -in /etc/letsencrypt/live/$siteName/fullchain.pem
</code>

---

Pour afficher les dates de génération et d'expiration d'un certificat d'un site distant :

<code>
openssl s_client -connect www.w3.org:443| openssl x509 -noout -dates
</code>

Exemple de résultat :

{{informatique:serveur:web-linux-apache:pasted:20210117-213056.png|Exemple de résultat pour les dates du certificat de www.w3.org}}
===== - Réinitialiser la configuration Let's Encrypt =====

Façon documentée :

<code BASH>
echo Affichage des noms possibles :
sudo ls /etc/letsencrypt/live
echo .
echo "Quel nom de domaine ?"
read siteName
certbot delete --cert-name $siteName
</code>


Façon brutale :

<code BASH letsencrypt_erase>
#!/bin/bash
# réinitialiser let's encrypt pour un domaine precis
echo Affichage des noms possibles :
sudo ls /etc/letsencrypt/live
echo .
echo "Quel nom de domaine ?"
read siteName
sudo rm -fr /etc/letsencrypt/live/$siteName/
sudo rm /etc/letsencrypt/renewal/$siteName.conf 
sudo rm -fr /etc/letsencrypt/archive/$siteName/
</code>



