Lorsque votre navigateur se connecte a un site HTTPS, il ne fait pas confiance au certificat aveuglement. Il verifie une chaine de confiance — une serie liee de certificats menant du certificat de votre site jusqu’a une Autorite de Certification (CA) racine pre-approuvee.
Les trois niveaux
┌─────────────────────────────────┐
│ CA RACINE │ Pre-installee dans les navigateurs/OS
│ (ISRG Root X1 pour LE) │ Auto-signee, longue validite (20+ ans)
└───────────────┬─────────────────┘
│ signe
▼
┌─────────────────────────────────┐
│ CA INTERMEDIAIRE │ Signee par la racine
│ (Let's Encrypt R3/R10) │ Validite moyenne (5-10 ans)
└───────────────┬─────────────────┘
│ signe
▼
┌─────────────────────────────────┐
│ VOTRE CERTIFICAT │ Signe par l'intermediaire
│ (example.com) │ Courte validite (90 jours pour LE)
└─────────────────────────────────┘
CA racine — Approuvee par les navigateurs et les systemes d’exploitation. Stockee dans le magasin de certificats de l’appareil. Auto-signee (personne ne signe pour la racine — elle EST l’ancre de confiance). Les cles racine sont conservees hors ligne dans des modules de securite materiels.
CA intermediaire — Signee par la racine. Emet effectivement les certificats d’entite finale. Si un intermediaire est compromis, seul celui-ci doit etre revoque — la racine reste en securite.
Certificat d’entite finale — Votre certificat. Signe par l’intermediaire. C’est ce que votre serveur envoie aux navigateurs.
Comment la verification fonctionne
Lorsque votre navigateur recoit un certificat :
- Lire votre certificat — extraire le nom de l’emetteur
- Trouver l’intermediaire — soit dans la reponse du serveur, soit dans le cache du navigateur
- Verifier la signature de l’intermediaire — verifier qu’elle est signee par une racine approuvee
- Verifier la signature de votre certificat — verifier qu’il est signe par l’intermediaire
- Verifier les dates de validite — aucun des certificats n’est expire
- Verifier la correspondance du domaine — le SAN/CN du certificat correspond a l’URL
- Verifier la revocation — le certificat n’a pas ete revoque (OCSP/CRL)
Si une etape echoue → le navigateur affiche un avertissement de securite.
Pourquoi l’intermediaire est important
L’erreur SSL la plus courante est un certificat intermediaire manquant. Si votre serveur n’envoie que votre certificat sans l’intermediaire, les navigateurs ne peuvent pas construire la chaine de confiance.
Nginx attend fullchain.pem (votre certificat + intermediaire combines) :
ssl_certificate /etc/ssl/fullchain.pem; # cert + intermediaire
Apache utilise des fichiers separes :
SSLCertificateFile /etc/ssl/cert.pem # votre cert
SSLCertificateChainFile /etc/ssl/chain.pem # intermediaire
GetHTTPS fournit a la fois fullchain.pem et des fichiers separes cert.pem + chain.pem, pour que vous ayez le bon format pour tout serveur.
La chaine de Let’s Encrypt
La chaine actuelle de Let’s Encrypt :
ISRG Root X1 (racine, dans tous les magasins de confiance)
└── Let's Encrypt R10 (intermediaire, signe votre certificat)
└── yourdomain.com (votre certificat)
Il existe aussi un chemin croise-signe via DST Root CA X3 d’IdenTrust pour la compatibilite avec les anciens appareils, mais ce n’est plus necessaire pour la plupart des cas d’utilisation.
Questions frequemment posees
Comment corriger les erreurs “certificat non approuve” ?
Presque toujours : il manque le certificat intermediaire. Utilisez fullchain.pem (Nginx) ou ajoutez SSLCertificateChainFile chain.pem (Apache). Testez avec :
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
Cherchez “verify return:1” (bon) vs “verify return:0” (probleme de chaine).
Puis-je voir la chaine dans mon navigateur ?
Oui. Cliquez sur le cadenas → “Certificat” (ou “La connexion est securisee” → “Le certificat est valide”). Vous verrez la chaine : votre certificat → intermediaire → racine.
Que se passe-t-il si une CA racine est compromise ?
La racine est retiree des magasins de confiance via les mises a jour du navigateur/OS. Tous les certificats emis sous cette racine deviennent non approuves. C’est extremement rare — les cles racine sont stockees dans des modules de securite materiels hors ligne avec des controles d’acces physiques.
Pourquoi Let’s Encrypt utilise-t-il un certificat intermediaire au lieu de signer directement avec la racine ?
Isolation de securite. Si la cle intermediaire est compromise, seule celle-ci doit etre revoquee — la racine reste en securite. La cle racine est conservee hors ligne et n’est utilisee que pour signer les intermediaires. C’est une pratique standard pour toutes les grandes Autorites de Certification.
Dois-je installer le certificat racine sur mon serveur ?
Non. Les certificats racine sont pre-installes dans les navigateurs et les systemes d’exploitation. Votre serveur n’a besoin d’envoyer que votre certificat + l’intermediaire. Le navigateur possede deja la racine et l’utilise pour verifier la chaine.
Debogage des problemes de chaine
L’erreur SSL la plus courante en production est une chaine de certificats incomplete. Voici une approche systematique pour diagnostiquer :
Etape 1 : Verifier la chaine que votre serveur envoie
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null
Examinez la sortie :
Certificate chain
0 s:CN = example.com
i:C = US, O = Let's Encrypt, CN = R10
1 s:C = US, O = Let's Encrypt, CN = R10
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
---
Verify return code: 0 (ok)
- Depth 0 = votre certificat
- Depth 1 = intermediaire
- “Verify return code: 0 (ok)” = la chaine est complete
Si vous ne voyez que depth 0 (pas de depth 1), l’intermediaire est manquant.
Etape 2 : Corriger la chaine
Nginx : Utilisez fullchain.pem (certificat + intermediaire combines) :
ssl_certificate /etc/ssl/fullchain.pem; # PAS cert.pem
Apache : Ajoutez l’intermediaire explicitement :
SSLCertificateChainFile /etc/ssl/chain.pem
Si vous avez perdu chain.pem : Telechargez l’intermediaire de Let’s Encrypt depuis letsencrypt.org/certificates ou re-emettez votre certificat avec GetHTTPS.
Etape 3 : Verifier la correction
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | grep "Verify return code"
# Doit indiquer : Verify return code: 0 (ok)