Let’s Encrypt est une autorité de certification libre et ouverte développée par Internet Security Research Group (ISRG). Les certificats émis par Let’s Encrypt sont approuvés par presque tous les navigateurs actuels.
Installer Certbot
Certbot est un outil permet d’obtenir et de renouveler les certificats SSL de Let’s Encrypt et de configurer les serveurs Web pour qu’ils utilisent ces mêmes certificats. Le paquet certbot est inclus dans les dépôts Debian/Ubuntu par défaut.
# apt update |
Generate une clé de Diffie-Hellman
L’échange de clés de Diffie–Hellman (DH) permettant d’échanger de façon sécurisée des clés cryptographiques sur un canal de communication non sécurisé.
Généreration de clés DH 2048 bits pour renforcer la sécurité :
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
Il est possible de paramétrer la taille des clés à 4096 bits mais le temps d’excution prendra environ 30 min.
Configuration d’un vhost
Pour obtenir un certificat SSL pour notre domaine, nous allons utiliser le plug-in Webroot qui fonctionne en créant un fichier temporaire pour valider le domaine demandé dans le répertoire ${webroot-path}/.well-known/acme-challenge
. Le serveur Let’s Encrypt envoie des requêtes HTTP au fichier temporaire pour confirmer que le domaine demandé est résolu sur le serveur sur lequel certbot s’exécute.
Nous allons mapper toutes les requêtes HTTP pour .well-known/acme-challenge
à un seul répertoire, /var/lib/letsencrypt
.
Création du répertoire accessible en écriture pour le serveur Nginx :
# mkdir -p /var/lib/letsencrypt/.well-known |
Le Vhost de nginx /etc/nginx/sites-available/monSitePro.conf :
server { |
Le fichier /etc/nginx/snippets/letsencrypt.conf :
location ^~ /.well-known/acme-challenge/ { |
Le fichier /etc/nginx/snippets/ssl.conf, consulter régulièrement le site https://cipherli.st/ pour les mises à jour :
ssl_protocols TLSv1.2; |
Activer le vhost en créant un lien symbolique vers le répertoire /etc/nginx/sites-enabled/
:
# ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ |
Relancer NGINX :
# systemctl restart nginx |
Générer le certificat
Faire un test préalable
Il existe une limite pour la génération de certificat même quand celui ci comporte une erreur, si on est pas sûr de sa configuration il est préférable d’utiliser l’option --dry-run
qui possède une limite beaucoup plus élevée et permet de faire un nombre assez important de tentatives par jours.
https://letsencrypt.org/docs/rate-limits/
https://letsencrypt.org/docs/staging-environment/
# certbot renew --dry-run |
Création du certificat
Si vous n’avez aucune erreur vous pouvez lancer la vraie commande pou créer un certificat SSL avec Certbot :
# certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com |
Puis relancer NGINX
# systemctl reload nginx |
Les noms de domaines avec des caractères accentués
Si votre nom de domaine comporte des caratères accentué comme síle-de-tansarville.fr un message d’erreur vous invitera à utiliser le Punycode.
# certbot --webroot -w /var/lib/letsencrypt/ -d síle-de-tansarville.fr -d www.síle-de-tansarville.fr |
Le Punycode est un encodage spécial utilisé pour convertir les caractères Unicode en ASCII (des accents et des caractères non latin), il est utilisé pour coder les noms de domaine internationalisés (IDN).
Le nom de domaine au format correspondant peut se trouver dans votre pannel d’administration des noms de domaines de votre registrar préféré ou vous pouvez utiliser cet outils de conversion : https://www.punycoder.com/.
Exemple :
我是猫.fr | xn--wnup5g6so.fr |
Note : La configuration des Vhost dans le serveur web doit se faire sous forme Punycode.
Renouvellement automatique des certificats Let’s Encrypt
Les certificats de Let Encrypt sont valables 90 jours. Pour les renouveler automatiquement avant leur expiration, le paquet certbot crée un cronjob qui s’exécute deux fois par jour et renouvellera automatiquement tout certificat 30 jours avant son expiration.
Comme nous utilisons le plug-in certbot webroot, une fois le certificat renouvelé, nous devons également recharger le service NGINX. Ajoutez –renew-hook «systemctl reload nginx»
au fichier /etc/cron.d/certbot
de la manière suivante :
# vim /etc/cron.d/certbot |
NOTE : Configuration actuelle, fonctionne sans problème :
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(4 3200))' && certbot -q renew |
Puis faire un test pour vérifier la configuration
# certbot renew --dry-run |
S’il n’y a pas d’erreur, cela signifie que le processus de renouvellement a réussi.
Backup des certificats
Il suffit simplement de copier le répertoire où Let’s Encrypt les génère.
# cp /etc/letsencrypt/ /chemin/letsencrypt.backup -r |
Revoquer un certificat
Pour révoquer un certificat on utilise l’option --cert-path
ansi que le chemin complet qui mène au certificat situé dans le répertoire archive
de Let’s Encrypt.
# certbot revoke --cert-path /etc/letsencrypt/archive/www.mydomain.com/cert1.pem |
Supprimer un certificat
Il suffit simplement de préciser l’option delete
et une liste des domaines avec les certificats à supprimer s’affichera.
# certbot delete |
Pour les problèmes de Cipher
Les sites à lire :
https://f4fia.wordpress.com/2015/08/09/configurer-son-serveur-web-en-https/
https://safeciphers.org/
VOIR LES GRADES
Erreurs rencontrées
Vérifications de base avant de commencer :
- Le domaine et les sous-domaine possèdent bien un enregistrement A au niveau des DNS.
- Le domaine et les sous-domaine sont définis dans NGINX.
- La génération des certificats commence par la racine “mondomaine” :
certbot certonly --webroot -w /var/lib/letsencrypt/ -d mondomaine.fr -d www.mondomaine.fr -d sous.mondomaine.fr
.
Impossibilté de générer un certificat
Le certificat Let’s Encrypt ne pouvait être généré uniquement si le sous-domaine n’était PAS définis dans NGINX.
Je n’ai toujours pas compris pkoi Let’s Encrypt me donnait cette erreur :
IMPORTANT NOTES: |
Remarque : La génération du domaine racine mondomaine.fr seul entrainait la création d’un nouveau certificat nommé mondomaine-0002.cert
laissant supposer qu’un mondomaine-0001.cert
existait déjà (ce qui était le cas) en plus du mondomaine.cert
qui avait fonctionnée jusque là.
Résolution du problème :
Faire un backup du dossier
/etc/letsencrypt/
Plusieurs solutions :
Aller dans la config NGINX
- Commenter les liens vers les certificats. Rententer de générez les certificats avec un
--dry-run
- Commenter la ou les lignes spécifiants les server_names. Rententer de générez les certificats avec un
--dry-run
- Mixer les deux
- Et décommenter les liens si tout se passe bien
- Commenter les liens vers les certificats. Rententer de générez les certificats avec un
Supprimer tous les certificats et répertoires en lien avec le domaine en question :
/etc/letsencrypt/renewal/mondomaine*
/etc/letsencrypt/archive/mondomaine*
/etc/letsencrypt/live/mondomaine*
- Rententer de générez les certificats avec un
--dry-run
Problème avec Python
L’erreur en question au moment de la génération de n’importe quel certificat :
# certbot certonly --webroot -w /var/lib/letsencrypt/ -d n0tes.fr --dry-run |
Il est fort probable que l’espace disque soit saturé ou insuffisant.
Problème de Fething
Ce problème est survenu après avoir ajouté un enregistrement AAA pour le sous domaine www, en plus de celle déjà existante avec l’IPV4.
Domain: www.mondomain-linux.fr |
Après avoir effacé l’enregistrement AAAA le certificat a pu être regenéré.
https://letsencrypt.org/fr/docs/ipv6-support/
Problème de redirection
Dans cette eurreur on voit que Let’s Encrypt galère entre le .com et le .fr (alors que le certificat demandé n’est que pour le .com).
IMPORTANT NOTES: |
Résolution :
Commenter dans NGINX la redirection, générez le certificat puis réactiver la redirection.
return 301 https://lesite.fr; |
Documentation
https://letsencrypt.org/fr/docs/
https://letsencrypt.org/docs/rate-limits/
https://letsencrypt.org/docs/staging-environment/
https://linuxize.com/post/secure-nginx-with-let-s-encrypt-on-debian-9/
https://f4fia.wordpress.com/2015/08/09/configurer-son-serveur-web-en-https/
https://www.tfrichet.fr/lets-encrypt-supprimer-correctement-un-domaine/