Module 03 · Chapitre 5

TP-07 - Activer HTTPS avec Let’s Encrypt

Objectifs

Lire les sorties
  • Les sorties sont des exemples attendus, pas des captures d’exécution sur votre VM.
  • Le domaine, les adresses, dates, numéros de version, chemins de certificat et identifiants de processus varient.
  • Comparer surtout le statut HTTP, Location, les chemins annoncés et le résultat des tests.

1. Domaine et accès réseau

Vous savez déjà créer un enregistrement DNS. Pour ce TP, choisissez un nouveau nom dédié, par exemple tls.votre-domaine.fr. Remplacez-le dans chaque commande et dans la configuration par votre véritable nom.

TypeNomValeur
Atls (si votre zone est votre-domaine.fr)IPv4 publique de votre VM
AAAA, facultatiftlsIPv6 publique de cette VM, uniquement si elle est opérationnelle
Note

Un record AAAA incorrect peut faire échouer la validation : Let’s Encrypt préfère initialement IPv6 quand A et AAAA existent. Corriger cet enregistrement ou le retirer si votre serveur ne fournit pas IPv6.

sudo apt update
sudo apt install nginx curl dnsutils
dig +short A tls.votre-domaine.fr
dig +short AAAA tls.votre-domaine.fr

Le premier résultat doit être votre IPv4 publique. Le second est vide si vous n’utilisez pas IPv6 ; sinon, il doit afficher votre IPv6 publique. Vérifier les valeurs, pas seulement la présence d’un résultat.

sudo ss -lntp 'sport = :80'
systemctl status nginx --no-pager

ss -lntp affiche les écoutes TCP et leurs processus ; le filtre limite l’affichage au port 80. Le service NGINX doit être active (running).

Port 80 déjà occupé

Si apache2 occupe le port 80, deux serveurs ne peuvent pas utiliser la même adresse et le même port. Pour une VM de formation où NGINX remplace Apache, arrêter Apache puis démarrer NGINX :

sudo systemctl stop apache2
sudo nginx -t && sudo systemctl start nginx

Cela interrompt les sites encore servis par Apache. N’effectuer ce changement que dans ce cas. Apache peut aussi être encore activé au démarrage : prévoir la gestion des services avant un prochain redémarrage de VM.

2. Préparer le site HTTP

Les blocs de création de fichiers suivants se font dans une session administrateur. Les délimiteurs 'EOF' conservent les variables NGINX telles que $uri.

sudo -i
mkdir -p /var/www/tp-nginx-07
cat > /var/www/tp-nginx-07/index.html <<'EOF'
<!doctype html>
<html lang="fr"><meta charset="utf-8"><title>TP HTTPS</title><h1>TP-07 : HTTPS fonctionne</h1></html>
EOF
cat > /etc/nginx/conf.d/tp-07-https.conf <<'EOF'
server {
    listen 80;
    server_name tls.votre-domaine.fr;
    root /var/www/tp-nginx-07;
    index index.html;
    access_log /var/log/nginx/tp-07-access.log;
    error_log /var/log/nginx/tp-07-error.log;
    location / {
        try_files $uri $uri/ =404;
    }
}
EOF
Configuration
  • server_name contient uniquement le nom DNS : ni http://, ni slash final.
  • La configuration est sous /etc/nginx/conf.d/ et est chargée par l’inclusion habituelle de ce répertoire dans le bloc http. Vérifier que cette inclusion existe si votre configuration principale est personnalisée.
  • Les logs du site sont séparés pour retrouver facilement les tests.
  • Le répertoire des pages ne contient ni configuration ni logs : seuls les fichiers du site y sont servis.
chmod 755 /var/www/tp-nginx-07
chmod 644 /var/www/tp-nginx-07/index.html

Les fichiers restent détenus par root. NGINX lit les pages avec www-data sur Ubuntu.

nginx -t && systemctl reload nginx
exit
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Le rechargement ne produit normalement aucune sortie. Depuis un poste extérieur à la VM (avec curl.exe sous Windows si nécessaire), tester :

curl -i http://tls.votre-domaine.fr/
HTTP/1.1 200 OK
Server: nginx/1.24.0 (Ubuntu)
Content-Type: text/html

<!doctype html>
<html lang="fr"><meta charset="utf-8"><title>TP HTTPS</title><h1>TP-07 : HTTPS fonctionne</h1></html>

Le texte de la page annonce l’objectif ; à cette étape la connexion est encore HTTP. Continuer uniquement si ce domaine affiche bien la page du TP. Une page de bienvenue Apache peut être un fichier statique servi par le site par défaut de NGINX : vérifier server_name et le rechargement.

3. Installer Certbot et demander le certificat

sudo apt update
sudo apt install certbot python3-certbot-nginx

certbot fournit le client ACME ; python3-certbot-nginx lui permet de valider le domaine et d’adapter NGINX. Cette procédure utilise les paquets Ubuntu, comme le cours STRICT ; ne pas mélanger cette installation avec une installation Snap existante.

Avant que Certbot ne modifie la configuration, conserver une copie hors du répertoire chargé par NGINX :

sudo cp /etc/nginx/conf.d/tp-07-https.conf /root/tp-07-https.conf.before-certbot

cp copie le fichier sans supprimer l’original. Il n’y a aucune commande de suppression de nginx.conf à effectuer.

sudo certbot --nginx -d tls.votre-domaine.fr --redirect

Fournir votre adresse e-mail si elle est demandée et accepter les conditions d’utilisation. Certbot réalise la validation HTTP-01, enregistre le certificat et ajoute HTTPS et la redirection dans NGINX.

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/tls.votre-domaine.fr/fullchain.pem
Key is saved at: /etc/letsencrypt/live/tls.votre-domaine.fr/privkey.pem
Successfully deployed certificate for tls.votre-domaine.fr

Utiliser les chemins réellement affichés : un certificat déjà existant peut donner un nom différent. Un message d’échec de validation signifie que le certificat n’a pas été délivré ; consulter la section diagnostic.

4. Vérifier HTTPS et la configuration

sudo nginx -t
sudo cat /etc/nginx/conf.d/tp-07-https.conf
sudo certbot certificates

Dans la configuration modifiée, repérer notamment les éléments suivants. Cet extrait sert à lire le résultat de Certbot, pas à remplacer tout le fichier :

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/tls.votre-domaine.fr/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tls.votre-domaine.fr/privkey.pem;

Depuis votre poste extérieur :

curl -I http://tls.votre-domaine.fr/
curl -I https://tls.votre-domaine.fr/
curl -iL http://tls.votre-domaine.fr/
HTTP/1.1 301 Moved Permanently
Location: https://tls.votre-domaine.fr/

HTTP/1.1 200 OK
Content-Type: text/html

<!doctype html>
<html lang="fr"><meta charset="utf-8"><title>TP HTTPS</title><h1>TP-07 : HTTPS fonctionne</h1></html>
Rappel — curl
  • -I : requête HEAD, uniquement les en-têtes.
  • -i : en-têtes et contenu.
  • -L : suit la redirection ; -iL montre ici le 301 puis le 200 et la page.
  • Ne pas utiliser -k pour valider le TP : cette option désactive la vérification du certificat.

Ouvrir également https://tls.votre-domaine.fr/ dans le navigateur et consulter les informations du certificat : domaine couvert, autorité et expiration. Le certificat est gratuit, mais cela ne rend pas automatiquement l’application sûre.

5. Tester le renouvellement

systemctl list-timers --all | grep certbot
sudo certbot renew --dry-run

Avec l’installation Ubuntu utilisée ici, la liste doit normalement contenir certbot.timer et certbot.service. Les dates varient. Si le timer est absent, vérifier le mode d’installation de Certbot ; ne pas considérer le renouvellement automatique comme validé.

Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/tls.votre-domaine.fr/fullchain.pem (success)

--dry-run teste la procédure via le service de test, sans remplacer le certificat de production. Si plusieurs certificats existent, ils peuvent tous apparaître dans le résultat. Garder les conditions de validation disponibles, notamment TCP 80.

6. Observer les logs et diagnostiquer

Après les tests curl, sur la VM :

sudo tail -n 10 /var/log/nginx/tp-07-access.log
sudo tail -n 20 /var/log/nginx/tp-07-error.log
sudo tail -n 30 /var/log/letsencrypt/letsencrypt.log

tail -n affiche les dernières lignes. Un journal d’erreurs peut rester vide si les tests réussissent.

198.51.100.20 - - [05/Oct/2026:17:00:00 +0000] "HEAD / HTTP/1.1" 301 0 "-" "curl/8.x"
198.51.100.20 - - [05/Oct/2026:17:00:01 +0000] "GET / HTTP/1.1" 200 112 "-" "curl/8.x"

Comparer l’heure, la méthode, le chemin et le statut : ces lignes montrent la redirection HTTP puis la page servie. L’adresse du client, la version curl et le nombre d’octets varieront.

Créer une erreur simple sans toucher au certificat

Depuis le poste extérieur, demander un fichier absent :

curl -i https://tls.votre-domaine.fr/fichier-absent.html
HTTP/1.1 404 Not Found

Sur la VM, relire le log d’accès :

sudo tail -n 5 /var/log/nginx/tp-07-access.log
198.51.100.20 - - [05/Oct/2026:17:01:00 +0000] "GET /fichier-absent.html HTTP/1.1" 404 162 "-" "curl/8.x"

La connexion HTTPS a réussi ; c’est le fichier demandé qui manque. Avec try_files ... =404, cette réponse n’entraîne pas forcément une ligne dans error_log. Tester à nouveau / doit donner 200.

SymptômeVérification utile
NGINX ne démarre pas : Address already in usesudo ss -lntp 'sport = :80' : identifier Apache ou un autre processus.
Page du site par défautVérifier server_name sans protocole ni slash, puis test et rechargement.
Certbot : timeout / connection refusedVérifier DNS A/AAAA, IP publique, accès TCP 80, règles cloud et pare-feu.
Certbot : unauthorized / Invalid responseLe challenge arrive sur une mauvaise page ou un autre serveur ; consulter le log Certbot, les DNS et le bloc NGINX.
HTTPS inaccessibleVérifier l’écoute TCP 443 et les règles réseau.
Erreur de certificatVérifier le nom demandé, le certificat installé et sa date ; ne pas masquer le problème avec -k.

Le site et le certificat sont conservés pour les prochains tests et renouvellements. Ne pas supprimer les fichiers dans /etc/letsencrypt pendant qu’ils sont référencés par NGINX.

Sources officielles