Cette note explique pas à pas ce qu’est un certificat, comment la signature fonctionne, et ce qui se passe réellement quand ton navigateur affiche le cadenas.
Problème de départ — le mensonge sur Internet
Imaginons qu’Alice veut envoyer son mot de passe à monentreprise.fr. Comment peut-elle être sûre qu’elle parle au vrai serveur et pas à un imposteur ?
Scénario sans certificat :
Alice ──► "Je veux me connecter à monentreprise.fr"
[Un attaquant "Mallory" se met au milieu]
Mallory ──► Alice : "C'est moi monentreprise.fr, voici ma clé publique"
Alice ──► Mallory : [mot de passe chiffré avec la clé de Mallory]
Mallory déchiffre le mot de passe → vol des credentials ✅ pour Mallory
Le problème fondamental : Alice ne peut pas vérifier si la clé publique qu’elle reçoit appartient vraiment à monentreprise.fr.
Rappel — Cryptographie asymétrique (clés publique/privée)
Avant d’expliquer les certificats, il faut comprendre les deux opérations de base :
Clé privée → garde secrète, ne la partage jamais
Clé publique → distribue librement à tout le monde
Opération 1 — Chiffrement :
n'importe qui peut chiffrer avec la clé publique
seul le propriétaire de la clé privée peut déchiffrer
Alice ──► Chiffre("Bonjour", clé_publique_Bob) ──► [données illisibles]
Bob ──► Déchiffre([données illisibles], clé_privée_Bob) ──► "Bonjour"
Opération 2 — Signature :
seul le propriétaire de la clé privée peut signer
n'importe qui peut vérifier la signature avec la clé publique
Bob ──► Signe("Bonjour", clé_privée_Bob) ──► [signature]
Alice ──► Vérifie("Bonjour", [signature], clé_publique_Bob) ──► ✅ ou ❌
La signature est la pièce maîtresse des certificats. C’est elle qui prouve l’authenticité.
Comment fonctionne une signature — l’exemple concret
Voici ce qui se passe réellement quand Let’s Encrypt signe un certificat.
Étape 1 — monentreprise.fr génère sa paire de clés
monentreprise.fr génère :
clé_privée_site ← stockée sur le serveur, jamais partagée
clé_publique_site ← distribuée à tout le monde via le certificat
Ces deux clés sont mathématiquement liées. Ce qui est signé avec la privée peut être vérifié avec la publique, et vice-versa.
Étape 2 — monentreprise.fr crée un CSR
Un CSR (Certificate Signing Request) est une “demande de certificat”. Il contient :
CSR de monentreprise.fr :
┌─────────────────────────────────────────┐
│ Domaine : monentreprise.fr │
│ Organisation : Mon Entreprise SAS │
│ Clé publique : [clé_publique_site] │
└─────────────────────────────────────────┘
+ Signé avec clé_privée_site
(pour prouver que le demandeur possède bien la clé privée correspondante)
Étape 3 — Let’s Encrypt vérifie le domaine
Avant de signer quoi que ce soit, Let’s Encrypt vérifie que monentreprise.fr appartient vraiment au demandeur :
Let's Encrypt ──► "Place ce fichier ici :
http://monentreprise.fr/.well-known/acme-challenge/TOKEN_SECRET"
monentreprise.fr ──► [crée le fichier sur son serveur]
Let's Encrypt ──► [accède à http://monentreprise.fr/.well-known/acme-challenge/TOKEN_SECRET]
[trouve le bon contenu] ──► ✅ Ce domaine appartient bien au demandeur
Étape 4 — Let’s Encrypt signe le certificat
C’est ici que la magie opère. Let’s Encrypt va signer le contenu du certificat avec sa propre clé privée.
Contenu du certificat (avant signature) :
┌─────────────────────────────────────────────────┐
│ Domaine : monentreprise.fr │
│ Clé publique : [clé_publique_site] │
│ Valide du : 01/01/2026 │
│ Valide jusqu'au : 01/04/2026 │
│ Émetteur : Let's Encrypt │
└─────────────────────────────────────────────────┘
Étape 4a — Calculer le hash du contenu :
hash = SHA256(contenu du certificat)
hash = "a3f9b2c1d4e5..." (64 caractères hexadécimaux)
Le hash est une "empreinte digitale" du contenu.
Si un seul bit change dans le certificat → hash complètement différent.
Étape 4b — Chiffrer le hash avec la clé privée de Let's Encrypt :
signature = RSA_chiffre(hash, clé_privée_letsencrypt)
signature = "7d2a9f3c8b1e..." (très long, plusieurs centaines d'octets)
Étape 4c — Attacher la signature au certificat :
Certificat final :
┌─────────────────────────────────────────────────┐
│ Domaine : monentreprise.fr │
│ Clé publique : [clé_publique_site] │
│ Valide du : 01/01/2026 │
│ Valide jusqu'au : 01/04/2026 │
│ Émetteur : Let's Encrypt │
│ Signature : "7d2a9f3c8b1e..." │ ← ajoutée par Let's Encrypt
└─────────────────────────────────────────────────┘
Étape 5 — Le navigateur vérifie le certificat
Alice ouvre son navigateur et va sur https://monentreprise.fr. Le serveur lui envoie le certificat. Voici ce que le navigateur fait automatiquement :
Navigateur d'Alice reçoit le certificat.
Vérification 1 — La signature est-elle valide ?
┌─────────────────────────────────────────────────────────┐
│ a) Recalculer le hash du contenu du certificat │
│ hash_recalculé = SHA256(contenu du certificat) │
│ hash_recalculé = "a3f9b2c1d4e5..." │
│ │
│ b) Déchiffrer la signature avec la clé PUBLIQUE │
│ de Let's Encrypt (stockée dans le trust store) │
│ hash_extrait = RSA_déchiffre(signature, clé_pub_LE) │
│ hash_extrait = "a3f9b2c1d4e5..." │
│ │
│ c) Comparer les deux hash │
│ hash_recalculé == hash_extrait ? │
│ "a3f9b2c1d4e5..." == "a3f9b2c1d4e5..." → ✅ │
└─────────────────────────────────────────────────────────┘
→ La signature est valide : Let's Encrypt a bien signé CE certificat,
sans modification depuis la signature.
Vérification 2 — Le domaine correspond-il ?
Le certificat dit : monentreprise.fr
L'URL dans le navigateur : monentreprise.fr
→ ✅ correspondance
Vérification 3 — Le certificat est-il encore valide ?
Date actuelle : 15/02/2026
Valide du : 01/01/2026 → Valide jusqu'au : 01/04/2026
→ ✅ dans la période de validité
Vérification 4 — Let's Encrypt est-il de confiance ?
Le navigateur a dans son trust store la clé publique de la CA racine ISRG Root X1
Let's Encrypt est signé par ISRG Root X1
→ ✅ chaîne de confiance validée
Résultat : 🔒 Cadenas affiché — connexion sécurisée
Pourquoi Mallory ne peut pas falsifier le certificat
Reprenons l’attaque du début. Mallory essaie de créer un faux certificat pour monentreprise.fr :
Mallory essaie de créer un faux certificat :
┌─────────────────────────────────────────────────┐
│ Domaine : monentreprise.fr │ ← Mallory met le vrai domaine
│ Clé publique : [clé_publique_MALLORY] │ ← Mallory met SA clé publique
│ Valide du : 01/01/2026 │
│ Valide jusqu'au : 01/04/2026 │
│ Émetteur : Let's Encrypt │
│ Signature : ??? │ ← Mallory ne peut pas signer !
└─────────────────────────────────────────────────┘
Pour signer ce certificat, Mallory aurait besoin de la CLÉ PRIVÉE de Let's Encrypt.
Cette clé privée n'a jamais quitté les serveurs de Let's Encrypt.
→ Mallory ne peut pas créer une signature valide.
Si Mallory copie la signature d'un vrai certificat Let's Encrypt :
hash_recalculé = SHA256(contenu modifié avec clé de Mallory) = "zzz999..."
hash_extrait = RSA_déchiffre(signature_copiée, clé_pub_LE) = "a3f9b2c1d4e5..."
"zzz999..." ≠ "a3f9b2c1d4e5..." → ❌ Signature invalide → navigateur bloque
Conclusion : Un certificat falsifié est immédiatement détecté. La sécurité repose entièrement sur le secret de la clé privée de la CA.
La chaîne de certificats en pratique
Let’s Encrypt ne signe pas directement avec sa CA racine (trop précieuse, hors ligne). Il y a une CA intermédiaire :
CA Racine ISRG Root X1 ← hors ligne, clé ultra-sécurisée
│ signe
▼
CA Intermédiaire Let's Encrypt R11 ← en ligne, signe les certs quotidiens
│ signe
▼
Certificat de monentreprise.fr ← ton certificat
Le navigateur reçoit les 3 :
1. Certificat de monentreprise.fr (envoyé par le serveur)
2. Certificat de Let's Encrypt R11 (envoyé par le serveur dans la chaîne)
3. Certificat ISRG Root X1 (dans le trust store du navigateur)
Vérification en cascade :
monentreprise.fr signé par R11 ? → vérifie avec clé publique R11 ✅
R11 signé par ISRG Root X1 ? → vérifie avec clé publique ISRG ✅
ISRG Root X1 dans le trust store ? → oui, installé par l'OS/navigateur ✅
→ Toute la chaîne est valide → 🔒
Récapitulatif visuel
LET'S ENCRYPT
┌──────────────────────────────┐
│ clé_privée_LE [TOP SECRET] │
│ clé_publique_LE [dans Firefox]│
└──────────────────────────────┘
│
│ signe avec clé_privée_LE
▼
MONENTREPRISE.FR ┌──────────────────────────────────────────┐
│ Domaine : monentreprise.fr │
│ Clé publique : [clé_pub_site] │
│ Expiration : 01/04/2026 │
│ Signature : SHA256(contenu) chiffré │
│ avec clé_privée_LE │
└──────────────────────────────────────────┘
│
│ envoyé au navigateur d'Alice
▼
NAVIGATEUR D'ALICE 1. Récupère clé_pub_LE depuis le trust store
2. Déchiffre la signature → obtient le hash
3. Recalcule le hash du contenu du cert
4. Compare les deux hash → ✅ identiques
5. Vérifie que le domaine correspond → ✅
6. Vérifie la date d'expiration → ✅
→ Affiche 🔒
FAQ — questions fréquentes
Q : Si la clé publique de Let’s Encrypt est publique, Mallory peut-elle la voler pour signer ?
R : Non. La signature nécessite la clé privée (secrète). La clé publique sert uniquement à vérifier une signature existante, pas à en créer une.
Q : Pourquoi 90 jours et pas 10 ans ?
R : Si une clé privée est compromise et qu’on ne le sait pas, limiter la durée du certificat limite la fenêtre d’attaque. 90 jours force aussi l’automatisation du renouvellement.
Q : Que se passe-t-il si Let’s Encrypt est piraté ?
R : Let’s Encrypt peut révoquer tous ses certificats (CRL/OCSP). Les navigateurs cesseront de faire confiance à sa CA intermédiaire. C’est pour ça que la CA racine est hors ligne.
Q : Pourquoi un cadenas vert ne garantit pas que le site est légitime ?
R : Le certificat prouve uniquement que tu parles à monentreprise.fr et que la communication est chiffrée. Il ne prouve pas que monentreprise.fr est un site honnête — un site de phishing peut avoir un certificat valide.
En relation avec
- Certificats — Vue d’ensemble — types DV/OV/EV, wildcards, usages
- X.509 — Format des certificats — tous les champs du certificat en détail
- PKI — Infrastructure à Clés Publiques — la hiérarchie complète des CA
- Cycle de vie et révocation — CSR, renouvellement, révocation
- Let’s Encrypt et ACME — comment certbot automatise tout ce processus
- TLS et SSL — comment le certificat est utilisé dans le handshake TLS