Cles, chiffrement et authentification - 05 - TLS, HTTPS et certificats : comment ca marche

Le fonctionnement de TLS et HTTPS demystifie. Certificate authorities, Let's Encrypt, et ce qui se passe quand tu tapes https://.

05 - TLS, HTTPS et certificats : comment ca marche

Ce que tu vas apprendre

  • Ce qui se passe quand tu tapes https:// dans ton navigateur
  • Le rôle des Certificate Authorities
  • Let's Encrypt et le protocole ACME
  • Les certificats auto-signes et quand les utiliser
  • Comment Caddy simplifie tout ca

Prerequisites


Que se passe-t-il quand tu tapes https:// ?

Quand tu visites https://exemple.com, ton navigateur et le serveur font un TLS handshake avant d'échanger la moindre donnee. Ca prend entre 50 et 200 millisecondes, et ca se passe en gros comme ca :

  1. Client Hello : ton navigateur envoie la liste des algorithmes de chiffrement qu'il supporte, plus un nombre aleatoire.

  2. Server Hello : le serveur choisit un algorithme, envoie son certificat (qui contient sa clé publique) et un autre nombre aleatoire.

  3. Verification du certificat : ton navigateur vérifié que le certificat est valide. Il est signe par une CA de confiance ? Il n'est pas expire ? Le nom de domaine correspond ?

  4. Échange de clés : le client et le serveur utilisent un échange Diffie-Hellman éphémère (ECDHE) pour générer une clé symetrique partagee. Meme si quelqu'un enregistre tout le trafic, il ne pourra pas reconstituer cette clé (c'est le forward secrecy).

  5. Chiffrement symetrique : à partir de la, toute la communication est chiffree avec AES (ou ChaCha20). Rapide, efficace.

C'est le chiffrement hybride dont on a parle dans l'article 01 : asymetrique pour l'échange, symetrique pour les donnees.

Les Certificate Authorities (CA)

Le certificat du serveur doit etre signe par une autorite de certification (CA) que ton navigateur reconnait. Ton OS et ton navigateur embarquent une liste de CAs de confiance (environ 150 racines dans Firefox en 2026).

Le système est hiérarchique. La CA racine signe des certificats intermediaires, qui signent les certificats des sites. Si tu veux voir la chaîne pour un site :

bashopenssl s_client -connect exemple.com:443 -showcerts </dev/null 2>/dev/null | openssl x509 -text -noout | head -20

Le problème des CAs, c'est la confiance centralisee. En 2011, la CA DigiNotar a ete compromise et a emis de faux certificats pour google.com. Tous les navigateurs ont du revoquer DigiNotar d'urgence. En 2015, Symantec a emis des certificats de test pour des domaines Google sans autorisation. Google a progressivement revoque la confiance en Symantec entre 2017 et 2018. Le système marche, mais il n'est pas parfait.

Let's Encrypt : le chiffrement pour tous

Avant 2015, un certificat TLS coutait entre 10 et 200 euros par an. Beaucoup de petits sites restaient en HTTP. Let's Encrypt, lance en avril 2016 par l'ISRG (Internet Security Research Group), a change la donne : des certificats gratuits, automatiques, valides 90 jours.

En mars 2026, Let's Encrypt protégé plus d'un milliard de sites. Le protocole utilise s'appelle ACME (Automatic Certificate Management Environment, RFC 8555). Le principe :

  1. Tu prouves que tu contrôles le domaine (en placant un fichier spécifique sur le serveur ou un enregistrement DNS)
  2. Let's Encrypt te delivre un certificat
  3. 60 jours plus tard, le renouvellement est automatique
bash# Avec certbot (le client ACME officiel)
sudo certbot --nginx -d exemple.com -d www.exemple.com

Certbot configure automatiquement Nginx et planifie le renouvellement. Ca prend 30 secondes.

Caddy : le zero-config TLS

Si tu deploies des applications web, je te recommande Caddy plutot que Nginx + Certbot. Caddy obtient et renouvelle les certificats Let's Encrypt automatiquement, sans configuration.

# Caddyfile complet pour un reverse proxy HTTPS
exemple.com {
    reverse_proxy localhost:3000
}

C'est tout. Caddy gere le certificat, le renouvellement, la redirection HTTP vers HTTPS, HTTP/2, et OCSP stapling. Zero commande supplementaire. Quand j'ai découvert Caddy, j'ai arrêté de configurer Nginx pour mes projets perso.

Les certificats auto-signes

Un certificat auto-signe, c'est un certificat que tu générés toi-meme, sans CA. Le chiffrement fonctionne, mais le navigateur affiche un gros avertissement parce qu'il ne peut pas vérifier l'identité du serveur.

bash# Generer un certificat auto-signe (valide 365 jours)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes

Quand c'est utile :

  • Développement local
  • Communication entre services internes
  • Tests

Quand c'est inacceptable :

  • Tout ce qui est expose a des utilisateurs
  • APIs publiques

Pour le dev local, mkcert est un meilleur choix : il créé une CA locale que ton navigateur accepte, sans avertissements.

bash# Installer mkcert et generer des certificats locaux
mkcert -install
mkcert localhost 127.0.0.1

mTLS : quand le client aussi prouve son identité

Dans le TLS classique, seul le serveur prouve son identité. Le mTLS (mutual TLS) ajoute un certificat cote client. Les deux parties se verifient mutuellement.

C'est utilise dans les architectures microservices (service mesh comme Istio), les APIs B2B, et certains VPNs. Tu n'en as probablement pas besoin pour un projet web classique, mais ca existe et ca vaut le coup de savoir que c'est possible.

Inspecter un certificat en ligne de commande

Quand un truc ne marche pas en HTTPS, openssl s_client est ton ami :

bash# Voir le certificat d'un site
echo | openssl s_client -connect exemple.com:443 2>/dev/null | openssl x509 -text -noout

# Verifier la date d'expiration
echo | openssl s_client -connect exemple.com:443 2>/dev/null | openssl x509 -enddate -noout

# Voir toute la chaine de certificats
echo | openssl s_client -connect exemple.com:443 -showcerts 2>/dev/null

J'utilise régulièrement la commande d'expiration pour vérifier que le renouvellement automatique fonctionne. Mieux vaut vérifier avant que les utilisateurs voient une erreur "NET::ERR_CERT_DATE_INVALID".

Recapitulatif

TLS combine tout ce qu'on a vu dans les articles précédents : chiffrement asymetrique pour l'échange de clés, symetrique pour les donnees, signatures pour l'authenticite, certificats pour la confiance. C'est le protocole qui fait tourner le web sécurisé.

Prochain article : on parle de la gestion des clés au quotidien. Rotation, backup, passphrases, clés materielles.


Navigation : Precedent : 04 - Signer ses commits Git | Suivant : 06 - Gerer ses clés


Sources

Retrouve d'autres articles techniques sur paltemps.fr.

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.