← Tous les cours / TLS/HTTPS Cours
00 — VUE D'ENSEMBLE

HTTPS — la séquence complète

DNS → TCP → TLS → HTTP — 4 étapes, 7 échanges réseau, une page chargée.

Quand ton navigateur charge https://example.com, il ne se contente pas d'envoyer une requête HTTP. Il traverse quatre couches de protocoles dans un ordre précis — chacune dépendant de la précédente.

Le pipeline HTTPS en 4 phases
DNS → TCP → TLS → HTTP. Chaque phase a ses propres allers-retours réseau. La performance d'une page HTTPS dépend de la somme de ces latences.
PhaseCe qui se passeAller-retours
DNS Résoudre example.com93.184.216.34 1 RTT (si pas en cache)
TCP SYN → SYN-ACK → ACK (3-way handshake) 1 RTT
TLS 1.3 ClientHello → ServerHello+Cert → Finished 1 RTT
HTTP GET / → 200 OK + HTML 1 RTT

Total minimal : 4 RTT pour une première connexion (sans cache DNS). Sur une ligne à 50 ms de latence, ça représente 200 ms avant le premier octet de HTML — même si le serveur répond instantanément.

DNS
resolve
TCP
connect
TLS
handshake
HTTP
request
Réponse
HTML
💡 TCP Fast Open + TLS 0-RTT : des optimisations permettent de fusionner certains allers-retours. HTTP/2 et HTTP/3 réutilisent les connexions TLS pour amortir ce coût sur de multiples requêtes.

La phase TLS est celle que ce cours explore en détail. Comprendre ses mécanismes — le handshake, les certificats, la négociation de clés — te donnera les outils pour diagnostiquer des lenteurs, des erreurs de certificat et des configurations faibles.

🔐 Simulateur — pipeline HTTPS

Clique sur "Charger la page" pour observer les 4 phases s'enchaîner en temps réel.

01 — HANDSHAKE TLS 1.3

Le handshake TLS 1.3 — 1 aller-retour

ClientHello, ServerHello, 4 messages chiffrés, Finished — le protocole de poignée de main en 1 RTT.

TLS 1.3 (RFC 8446, 2018) a radicalement simplifié le handshake de son prédécesseur. Là où TLS 1.2 nécessitait 2 allers-retours avant d'envoyer des données applicatives, TLS 1.3 n'en nécessite qu'un seul.

RTT (Round-Trip Time)
Temps pour qu'un message parte du client, arrive au serveur, et que la réponse revienne. Un handshake "1-RTT" signifie qu'une seule de ces boucles est nécessaire avant de pouvoir envoyer des données.

Les messages du handshake TLS 1.3

Voici la séquence complète, dans l'ordre chronologique :

MessageÉmetteurChiffré ?Contenu
ClientHello Client Non Versions TLS supportées, key_share (clé publique ECDHE), cipher suites, SNI, ALPN
ServerHello Serveur Non Version choisie, key_share serveur (clé publique ECDHE), cipher suite choisie
EncryptedExtensions Serveur Oui Extensions supplémentaires (ALPN confirmé, max_fragment_length…)
Certificate Serveur Oui Chaîne de certificats X.509 du serveur
CertificateVerify Serveur Oui Signature sur le transcript du handshake (prouve la possession de la clé privée)
Finished (serveur) Serveur Oui MAC sur tout le transcript — authentifie l'ensemble de la négociation
Finished (client) Client Oui MAC côté client — confirme que le client a reçu et vérifié tout correctement
🔑 Clé partagée dès ServerHello : après l'échange des deux key_share (client dans ClientHello, serveur dans ServerHello), les deux parties peuvent calculer indépendamment la même clé secrète via ECDH. Tout ce qui suit est donc chiffré — y compris le certificat.

Pourquoi le certificat est-il chiffré ?

En TLS 1.2, le certificat voyageait en clair. N'importe quel observateur réseau pouvait voir quel site tu visitais (même sans déchiffrer la communication). En TLS 1.3, le certificat est dans Certificate, chiffré après ServerHello. Seul le SNI dans le ClientHello révèle encore le domaine cible — et ECH (Encrypted Client Hello, RFC en cours) est conçu pour chiffrer même ça.

Key Schedule TLS 1.3
La dérivation des clés suit un graphe HKDF (HMAC-based Key Derivation Function) précis : Early Secret → Handshake Secret → Master Secret. Chaque niveau produit des clés distinctes pour le chiffrement et l'authentification du trafic entrant et sortant.

🤝 Simulateur — handshake TLS 1.3

Clique sur "Démarrer le handshake" pour voir les messages apparaître un par un.

02 — CERTIFICATS X.509

Certificats X.509 — la chaîne de confiance

Leaf → Intermediate → Root — comment le navigateur vérifie qui tu es vraiment.

Un certificat X.509, c'est comme un passeport délivré par une autorité reconnue : il lie une clé publique à une identité, et porte la signature de quelqu'un en qui tout le monde fait confiance.

Certificat X.509
Document structuré (ASN.1/DER, souvent encodé en PEM) contenant une clé publique, les informations d'identité du titulaire, la période de validité, et la signature cryptographique d'une Autorité de Certification (CA).

Les champs d'un certificat

ChampExempleRôle
serialNumber 0A:1B:2C… Identifiant unique chez ce CA — utilisé pour la révocation
issuer CN=R3, O=Let's Encrypt Qui a signé ce certificat
subject CN=example.com Pour qui ce certificat a été émis
notBefore / notAfter 2025-01-01 … 2025-04-01 Fenêtre de validité (Let's Encrypt : 90 jours)
subjectPublicKeyInfo EC P-256 ou RSA 2048 La clé publique du serveur
subjectAltName (SAN) DNS:example.com, DNS:www.example.com Domaines couverts (RFC 2818 : utiliser SAN, pas CN)
basicConstraints CA:FALSE Certificat feuille (FALSE) ou autorité pouvant signer d'autres certs (TRUE)
💡 SAN vs CN : historiquement, le champ CN (Common Name) était utilisé pour le domaine. Depuis la RFC 2818, c'est subjectAltName qui fait foi. Les navigateurs modernes ignorent le CN si SAN est absent — ou rejettent le certificat.

La chaîne de confiance

Ton navigateur ne connaît pas directement le certificat de example.com. Il suit une chaîne de signatures jusqu'à un certificat racine (Root CA) qu'il stocke dans son trust store.

Leaf
example.com
signé par →
Intermediate CA
Let's Encrypt R3
signé par →
Root CA
ISRG Root X1
Trust Store
navigateur / OS

Pourquoi cette hiérarchie ? Les Root CA gardent leurs clés privées hors ligne, dans des HSM (Hardware Security Modules) en chambre forte. Signer directement des certificats feuilles les exposerait trop. Les Intermediate CA, eux, sont en ligne pour signer, mais leur compromission n'affecte pas le Root.

Certificate Transparency (CT)
Mécanisme (RFC 6962) qui oblige les CAs à enregistrer tout certificat émis dans des logs publics auditables. Un SCT (Signed Certificate Timestamp) est inclus dans le certificat ou dans l'extension TLS comme preuve d'enregistrement. Cela rend impossible l'émission silencieuse de certificats frauduleux.

Types de certificats DV, OV, EV

TypeValidationIndicateur visuelUsage
DV Domain Validation Prouver le contrôle du domaine (challenge DNS ou HTTP) Cadenas simple Sites web, APIs, Let's Encrypt
OV Organization Validation Vérification de l'organisation (documents légaux) Cadenas + détails orga Sites d'entreprises
EV Extended Validation Vérification approfondie (audit, adresse physique…) Anciennement barre verte (supprimé) Banques, e-commerce haute valeur
⚠️ EV ne garantit pas la sécurité : les navigateurs ont supprimé l'affichage visuel spécial d'EV car des études ont montré que les utilisateurs n'y faisaient pas attention. Un DV Let's Encrypt offre le même niveau de chiffrement qu'un EV.
03 — FORWARD SECRECY

Forward Secrecy et ECDHE

Des clés éphémères pour chaque connexion — même si la clé du serveur fuite demain, les sessions d'hier restent secrètes.

Imagine que quelqu'un enregistre tout ton trafic HTTPS chiffré aujourd'hui. Si dans 5 ans la clé privée du serveur fuite, pourra-t-il déchiffrer ce qu'il a capturé ? Avec le Forward Secrecy, la réponse est non.

Perfect Forward Secrecy (PFS)
Propriété cryptographique garantissant que la compromission de la clé à long terme d'un serveur ne compromet pas les sessions passées. Obtenue en utilisant des clés éphémères (générées pour chaque connexion et jamais stockées) pour l'échange de clés de session.

Le problème sans Forward Secrecy (TLS 1.2 avec RSA)

Dans TLS 1.2 sans ECDHE, l'échange de clés fonctionnait ainsi :

  1. Le client génère un pre-master secret aléatoire.
  2. Il le chiffre avec la clé publique RSA du serveur (du certificat).
  3. Le serveur déchiffre avec sa clé privée RSA.

Problème : si un attaquant a enregistré la session et vole plus tard la clé privée RSA du serveur, il peut déchiffrer le pre-master secret, reconstruire les clés de session, et déchiffrer toute la conversation.

⚠️ Piège classique : même les connexions passées sont vulnérables. Ce n'est pas de la paranoïa — des services de renseignement ont effectivement collecté du trafic TLS chiffré en espérant casser les clés plus tard.

ECDHE — Elliptic Curve Diffie-Hellman Ephemeral

Avec ECDHE, chaque connexion génère une paire de clés temporaires (éphémères) qui sont jetées après la session :

Client
génère clé privée éphémère c
calcule C = c·G
C →
Échange
ClientHello : key_share C
ServerHello : key_share S
← S
Serveur
génère clé privée éphémère s
calcule S = s·G

Les deux parties calculent indépendamment le même secret partagé :

Un observateur voit C et S, mais résoudre c ou s depuis un point de courbe elliptique est computationnellement infaisable (problème du logarithme discret sur courbe elliptique).

Courbe X25519
Courbe elliptique de Bernstein (Curve25519, RFC 7748) recommandée pour TLS 1.3. Ses avantages : clé privée de 32 octets seulement, pas de paramètres spéciaux à valider (résistance aux attaques par courbe invalide), implémentation rapide et résistante aux timing attacks. Autres courbes supportées : P-256 (NIST), P-384.

Pourquoi TLS 1.3 l'impose

TLS 1.3 a supprimé les cipher suites à échange RSA statique (TLS_RSA_WITH_*). Toutes les suites TLS 1.3 utilisent ECDHE (ou DHE). Le Forward Secrecy n'est plus optionnel — c'est la seule façon de faire.

TLS 1.2 (RSA exchange)TLS 1.3 (ECDHE)
Clé de session dépend de Clé privée RSA long-terme Clé privée éphémère (jetée après)
Forward Secrecy Non Oui
Sessions passées si clé compromise Toutes déchiffrables Protégées
04 — CIPHER SUITES

Cipher suites TLS 1.3 — AEAD obligatoire

3 suites seulement, toutes AEAD — AES-GCM et ChaCha20-Poly1305, chiffrement authentifié sans exception.

TLS 1.2 supportait des centaines de cipher suites, incluant des algorithmes cassés (RC4), vulnérables (CBC sans HMAC-then-encrypt correct), ou simplement anciens. TLS 1.3 fait table rase : seulement 5 suites définies, toutes AEAD.

AEAD — Authenticated Encryption with Associated Data
Famille d'algorithmes qui combinent chiffrement et authentification en une seule primitive. Un message chiffré AEAD ne peut pas être modifié sans que le destinataire le détecte. Élimine les attaques de type "padding oracle" possibles avec CBC+MAC séparé.

Les 5 cipher suites TLS 1.3

SuiteAlgorithme AEADHash (HKDF)Notes
TLS_AES_128_GCM_SHA256 AES-128-GCM SHA-256 Suite par défaut recommandée
TLS_AES_256_GCM_SHA384 AES-256-GCM SHA-384 Pour contextes haute sécurité
TLS_CHACHA20_POLY1305_SHA256 ChaCha20-Poly1305 SHA-256 Préférable sur matériel sans AES-NI
TLS_AES_128_CCM_SHA256 AES-128-CCM SHA-256 Environnements contraints (IoT)
TLS_AES_128_CCM_8_SHA256 AES-128-CCM-8 SHA-256 Tag d'authentification réduit (8 octets)
💡 Lecture d'une cipher suite TLS 1.3 : le format est TLS_<AEAD>_<HASH> — aucune mention de l'algorithme d'échange de clés, car c'est toujours ECDHE en TLS 1.3. Contrairement au format TLS 1.2 qui incluait les quatre composants : échange de clés, authentification, chiffrement, MAC.

AES-GCM vs ChaCha20-Poly1305

AES-GCM
  • AES (Rijndael) en mode Galois/Counter
  • Très rapide sur CPU avec instructions AES-NI (x86, ARM Cortex-A)
  • GCM fournit l'authentification via GHASH
  • Vulnérable si le nonce (IV) est réutilisé — catastrophique
  • Standard pour serveurs, datacenters
ChaCha20-Poly1305
  • ChaCha20 (stream cipher) + Poly1305 (MAC)
  • Conçu par D.J. Bernstein pour logiciel uniquement
  • Rapide sans AES-NI (IoT, mobile bas de gamme)
  • Résistance à la réutilisation de nonce légèrement meilleure
  • Standard pour appareils mobiles, navigateurs modernes
Négociation de la cipher suite
Le client liste ses suites supportées dans ClientHello (par ordre de préférence). Le serveur choisit la première qu'il supporte aussi. En TLS 1.3, la configuration serveur recommandée est d'accepter les 3 premières suites du tableau ci-dessus et de laisser le client choisir selon ses capacités matérielles.

Ce que TLS 1.3 a éliminé

Algorithme suppriméPourquoi
RC4 Biais statistiques connus, attaques pratiques depuis 2013
3DES (Triple-DES) Vulnérable à SWEET32 (attaque d'anniversaire sur blocs 64 bits)
AES-CBC Vulnérable aux attaques padding oracle (BEAST, POODLE) sans précautions
MD5, SHA-1 Collisions connues — ne peuvent plus servir à l'authentification
Échange RSA statique Pas de Forward Secrecy
05 — SESSION RESUMPTION

Session resumption et 0-RTT

Le ticket PSK permet de reprendre une session sans refaire le handshake — 0-RTT envoie les données avant même le Finished.

Un handshake TLS 1.3 complet coûte 1 RTT. Pour les connexions répétées au même serveur (navigation sur un site, reconnexions après coupure réseau), TLS 1.3 propose de sauter ce coût grâce aux tickets PSK.

PSK — Pre-Shared Key
Secret partagé établi lors d'une session précédente. En TLS 1.3, le serveur envoie un ticket de session chiffré (NewSessionTicket) après le handshake. Le client peut le présenter lors d'une reconnexion pour reprendre la session sans refaire l'échange ECDHE complet.

Session resumption 1-RTT avec PSK

Client
ClientHello + psk_identity
(ticket de la session précédente)
Serveur
déchiffre le ticket,
retrouve le master secret
Serveur
ServerHello + Finished
(1 seul message)

Le serveur n'a pas besoin d'envoyer son certificat à nouveau — l'identité a déjà été vérifiée. La connexion est établie en 1 RTT, soit le même coût qu'un handshake initial.

Structure du NewSessionTicket
Le ticket est opaque pour le client : c'est un blob chiffré par le serveur avec une clé symétrique connue de lui seul. Il contient typiquement : le master secret de session, les paramètres de sécurité, un timestamp, et une durée de validité. Sa taille est de l'ordre de 250-500 octets.

0-RTT — Early Data

TLS 1.3 va plus loin : le client peut envoyer des données applicatives dans le premier message, avant même d'avoir reçu le Finished du serveur. C'est le 0-RTT.

Client
ClientHello + psk_identity
+ Early Data (0-RTT)
Serveur
traite Early Data
pendant le handshake
Serveur
ServerHello + Finished
+ EndOfEarlyData
⚠️ Risque de rejeu (replay attack) : les données 0-RTT ne sont pas protégées contre le rejeu. Un attaquant qui capture le premier paquet peut le renvoyer au serveur. Il ne peut pas le déchiffrer, mais si la requête a des effets de bord (achat, déconnexion…), la répétition peut causer des dommages. Utiliser 0-RTT uniquement pour des requêtes idempotentes (GET sans état, par exemple).

Comparatif des modes de connexion

ModeRTT avant donnéesForward SecrecyProtection rejeu
Handshake complet TLS 1.3 1 RTT Oui Oui
Resumption PSK (1-RTT) 1 RTT Partiel Oui
0-RTT Early Data 0 RTT Partiel Non
💡 Forward Secrecy partiel avec PSK : si la clé de ticket serveur est compromise, toutes les sessions reprises avec ce ticket le sont aussi. Les serveurs doivent donc faire tourner leurs clés de ticket régulièrement (toutes les quelques heures en pratique).
06 — SNI ET ALPN

SNI et ALPN — négocier dans le handshake

SNI dit au serveur quel domaine tu veux. ALPN lui dit quel protocole applicatif tu parles.

Le ClientHello de TLS transporte deux extensions qui permettent au serveur de prendre des décisions avant même que le handshake soit terminé : SNI pour savoir quel certificat présenter, ALPN pour négocier le protocole applicatif.

SNI — Server Name Indication

SNI (RFC 6066)
Extension TLS qui permet au client d'indiquer le nom d'hôte du serveur qu'il veut contacter, dans le ClientHello. Sans SNI, un serveur hébergeant plusieurs domaines sur la même IP ne saurait pas quel certificat présenter.

Le problème que SNI résout : en HTTP, le header Host: permet le virtual hosting sur une seule IP. Mais en HTTPS, le serveur doit présenter son certificat avant de recevoir les headers HTTP. Sans SNI, impossible de faire du virtual hosting HTTPS avec plusieurs domaines sur une même IP.

Client
ClientHello
SNI: "blog.example.com"
Serveur
IP: 203.0.113.1
(héberge blog + shop + api)
sélectionne →
Certificat
blog.example.com
⚠️ SNI en clair : le ClientHello n'est pas chiffré — le SNI est donc visible par un observateur réseau (FAI, pare-feu). C'est la principale information de métadonnées qui reste visible même avec HTTPS. ECH (Encrypted ClientHello) est conçu pour chiffrer aussi le SNI, mais son déploiement est encore limité en 2025.

ALPN — Application-Layer Protocol Negotiation

ALPN (RFC 7301)
Extension TLS permettant au client et au serveur de négocier quel protocole applicatif ils utiliseront au-dessus de TLS, pendant le handshake lui-même. Élimine un aller-retour supplémentaire qui serait nécessaire pour négocier le protocole après TLS.

Le client envoie une liste de protocoles qu'il supporte (par ordre de préférence) :

// Dans ClientHello, extension ALPN :
"h2"          // HTTP/2
"http/1.1"    // HTTP/1.1

Le serveur répond avec le protocole choisi dans EncryptedExtensions :

// Dans EncryptedExtensions :
"h2"          // Le serveur choisit HTTP/2

Protocoles identifiants ALPN courants

IdentifiantProtocoleUsage
http/1.1 HTTP/1.1 Fallback universel
h2 HTTP/2 Multiplexage, server push, headers compressés
h3 HTTP/3 (via QUIC) UDP-based, 0-RTT natif, pas de head-of-line blocking
acme-tls/1 ACME TLS-ALPN-01 Challenge Let's Encrypt pour validation TLS
dot DNS over TLS Requêtes DNS chiffrées (port 853)
💡 ALPN dans nginx : listen 443 ssl http2; active automatiquement ALPN avec h2 et http/1.1. Dans Caddy, c'est automatique. L'absence d'ALPN force HTTP/1.1 même si le client supporte HTTP/2.

SNI + ALPN ensemble dans ClientHello

Ces deux extensions voyagent dans le même ClientHello. Le serveur peut ainsi, en un seul message reçu du client, savoir :

07 — HSTS, CAA, OCSP

HSTS, CAA et OCSP Stapling

Trois mécanismes complémentaires — forcer HTTPS, restreindre les CAs, prouver la non-révocation sans latence.

TLS seul ne suffit pas pour une sécurité HTTPS complète. Trois mécanismes complémentaires ferment des brèches que le handshake TLS ne couvre pas : le downgrade vers HTTP, l'émission de certificats non autorisés, et la vérification de révocation lente.

HSTS — HTTP Strict Transport Security

HSTS (RFC 6797)
Header HTTP qui demande au navigateur de n'utiliser que HTTPS pour un domaine donné, pendant une durée spécifiée. Après réception, le navigateur convertit automatiquement toutes les URLs http:// en https:// sans faire de requête réseau.

Le header se présente ainsi :

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
DirectiveEffet
max-age=31536000 Durée de mémorisation : 1 an (en secondes)
includeSubDomains Applique HSTS à tous les sous-domaines
preload Indique le souhait d'être dans la preload list des navigateurs
HSTS Preload List
Liste de domaines compilée dans les navigateurs (Chromium, Firefox, Safari) — ces domaines sont connus HTTPS-only avant même la première visite. Élimine l'attaque "HTTPS Stripping" sur la toute première connexion. Soumission via hstspreload.org.
⚠️ HSTS est irréversible à court terme : si tu désactives HTTPS après avoir envoyé un HSTS max-age=1 an, les navigateurs qui ont mémorisé le header refuseront de contacter ton site en HTTP pendant un an. Toujours commencer avec un petit max-age en test.

CAA — Certification Authority Authorization

CAA (RFC 8659)
Enregistrement DNS qui liste les CAs autorisées à émettre des certificats pour un domaine. Un CA qui reçoit une demande de certificat pour un domaine doit vérifier ses enregistrements CAA et refuser s'il n'y est pas listé.
# Enregistrements DNS CAA pour example.com :
example.com  CAA  0  issue      "letsencrypt.org"
example.com  CAA  0  issuewild  "letsencrypt.org"
example.com  CAA  0  iodef      "mailto:security@example.com"
Tag CAASignification
issue CA autorisée pour les certificats standards
issuewild CA autorisée pour les certificats wildcard (*.example.com)
iodef URL/email pour signaler les violations de politique

OCSP Stapling

OCSP — Online Certificate Status Protocol (RFC 6960)
Protocole permettant de vérifier si un certificat a été révoqué. Le client interroge le répondeur OCSP du CA avec le numéro de série du certificat et reçoit une réponse signée indiquant "valid", "revoked" ou "unknown".

Le problème de l'OCSP classique : le client doit contacter le serveur OCSP du CA à chaque connexion — ajoutant une requête réseau vers un tiers, de la latence, et révélant au CA quel site tu visites.

OCSP Stapling (RFC 6066)
Optimisation où le serveur (et non le client) pré-charge périodiquement la réponse OCSP depuis le CA. Cette réponse est ensuite "agrafée" (stapled) dans le message CertificateStatus du handshake TLS. Le client reçoit la preuve de non-révocation sans contact avec le CA.
Serveur
(périodiquement)
→ OCSP request →
CA OCSP
répond : "valid"
signé jusqu'à J+7
← réponse signée ←
Serveur
met en cache
la réponse

Lors du handshake TLS, le serveur inclut cette réponse dans le message CertificateStatus. Le client vérifie la signature sans contacter le CA.

Avantages de l'OCSP Stapling :

08 — ATTAQUES & PROTECTIONS

Attaques historiques et protections

BEAST, POODLE, HEARTBLEED, BREACH — ce que chacune a cassé et ce que TLS 1.3 a corrigé.

L'histoire de TLS est jalonnée d'attaques qui ont forcé l'évolution du protocole. Comprendre ces attaques, c'est comprendre pourquoi TLS 1.3 est conçu comme il l'est.

BEAST — Browser Exploit Against SSL/TLS (2011)

BEAST
Attaque contre TLS 1.0 et SSL 3.0 exploitant le mode CBC avec des IVs prédictibles. En observant le trafic chiffré et en injectant des données choisies, l'attaquant peut récupérer des octets de données sensibles (cookie de session).
AspectDétail
Protocoles affectés TLS ≤ 1.0, SSL 3.0
Mécanisme IV = dernier bloc chiffré précédent (CBC enchaîné) → prédictible
Correction TLS 1.2 IV aléatoire par enregistrement
Correction TLS 1.3 AES-CBC supprimé, AEAD uniquement

POODLE — Padding Oracle On Downgraded Legacy Encryption (2014)

POODLE
Attaque forçant le navigateur à se rabattre sur SSL 3.0 (via échecs de handshake TLS simulés), puis exploitant une faiblesse du padding CBC de SSL 3.0. Permet de déchiffrer 1 octet par ~256 tentatives.
⚠️ Downgrade attack : POODLE n'attaque pas TLS 1.2 — il force la rétrogradation vers un protocole plus ancien et vulnérable. TLS 1.3 contrecarre ça avec le mécanisme de downgrade sentinel : si un serveur TLS 1.3 répond à une négociation TLS 1.2, il poison les 8 derniers octets du server_random avec une valeur spéciale (44 4F 57 4E 47 52 44 01). Un client TLS 1.3 voyant ce marqueur dans une réponse TLS 1.2 sait qu'une attaque de downgrade est en cours et coupe la connexion.

HEARTBLEED (2014)

HEARTBLEED (CVE-2014-0160)
Bug dans OpenSSL (versions 1.0.1 à 1.0.1f) dans l'extension "Heartbeat" de TLS. Un attaquant envoyait un message heartbeat avec une taille déclarée supérieure à la taille réelle — OpenSSL lisait 64 Ko de mémoire au-delà du buffer et les retournait, exposant clés privées, mots de passe, certificats.
💡 HEARTBLEED n'est pas une faille TLS : c'est un bug d'implémentation dans OpenSSL, pas une faiblesse du protocole TLS lui-même. La correction est le patching d'OpenSSL, pas un changement de protocole. Cela rappelle que la sécurité TLS dépend aussi de la qualité des implémentations.

BREACH — Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext (2013)

BREACH
Attaque contre la compression HTTP (gzip/deflate) sur des réponses HTTPS contenant des données secrètes réfléchies (CSRF token, session ID). En envoyant de nombreuses requêtes avec des préfixes variants, l'attaquant infère le secret un caractère à la fois en observant la taille compressée.
AttaqueCibleCorrection principaleTLS 1.3 aide ?
BEAST CBC + IV prédictible IV aléatoire / TLS 1.2+ Oui (AEAD uniquement)
POODLE Downgrade SSL 3.0 Désactiver SSL 3.0 Oui (sentinel + AEAD)
HEARTBLEED Bug OpenSSL Patcher OpenSSL Neutre (bug impl.)
BREACH Compression HTTP + secret réfléchi Désactiver gzip sur données sensibles Neutre (couche HTTP)
09 — SYNTHÈSE

Synthèse — configurer HTTPS correctement

Quelle version TLS, quel cipher, quel header — le guide de configuration sécurisée d'un serveur HTTPS.

Après avoir exploré chaque mécanisme individuellement, voici comment ils s'assemblent en une configuration HTTPS solide. Ce n'est pas une check-list exhaustive — c'est un guide de décision raisonné.

Quelle version TLS ?

VersionÀ activer ?Raison
SSL 2.0 / SSL 3.0 Jamais DROWN, POODLE — protocoles cassés
TLS 1.0 / TLS 1.1 Non Dépréciés RFC 8996 (2021), BEAST, pas de Forward Secrecy obligatoire
TLS 1.2 Optionnel Encore nécessaire pour la compatibilité ascendante (vieux clients)
TLS 1.3 Toujours 1-RTT, Forward Secrecy obligatoire, AEAD uniquement, handshake chiffré
Recommandation 2025
TLS 1.3 seul si ton audience est connue (API, B2B, applis modernes). TLS 1.2 + TLS 1.3 si tu as un public grand public incluant potentiellement de vieux appareils. Désactiver TLS 1.0/1.1 dans tous les cas — les navigateurs eux-mêmes les ont bloqués depuis 2020.

Quelles cipher suites pour TLS 1.2 ?

Si tu dois maintenir TLS 1.2, n'accepte que :

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

Toutes avec ECDHE (Forward Secrecy) et GCM ou ChaCha20 (AEAD). Pas de CBC, pas de RSA statique.

Checklist de configuration serveur

MécanismeConfiguration ciblePriorité
Versions TLS TLS 1.2 + TLS 1.3 (ou TLS 1.3 seul) Critique
Certificat EC P-256 ou RSA 2048+ ; SAN pour tous les domaines Critique
HSTS max-age=31536000; includeSubDomains Critique
OCSP Stapling Activé avec ssl_stapling on; (nginx) ou automatique (Caddy) Important
HSTS Preload Soumission après 6 mois de HSTS stable Important
CAA DNS issue "letsencrypt.org" ou ton CA Important
0-RTT Désactivé par défaut sauf si requêtes idempotentes uniquement Optionnel
ALPN h2, http/1.1 (activé automatiquement sur la plupart des serveurs modernes) Automatique
💡 Outils de vérification : SSL Labs (ssllabs.com/ssltest) note ta configuration de A+ à F et identifie les faiblesses. Observatory de Mozilla (observatory.mozilla.org) teste les headers de sécurité. openssl s_client -connect example.com:443 -tls1_3 te donne les détails du handshake en ligne de commande.

Ce que TLS ne couvre pas

TLS protège le transit des données entre client et serveur. Il ne protège pas :

En résumé
TLS 1.3 est le socle d'une communication web sécurisée : Forward Secrecy obligatoire, AEAD exclusif, handshake chiffré, 1-RTT. Complète-le avec HSTS pour forcer HTTPS, CAA pour contrôler les émetteurs de certificats, et OCSP Stapling pour une révocation rapide et privée. La configuration n'est pas une opération ponctuelle — audite-la régulièrement avec les outils disponibles.