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.
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.
| Phase | Ce qui se passe | Aller-retours |
|---|---|---|
| DNS | Résoudre example.com → 93.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.
resolve
connect
handshake
request
HTML
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.
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.
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 | Émetteur | Chiffré ? | 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 |
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.
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.
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.
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
| Champ | Exemple | Rô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) |
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.
example.com
Let's Encrypt R3
ISRG Root X1
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.
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
| Type | Validation | Indicateur visuel | Usage |
|---|---|---|---|
| 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 |
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.
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 :
- Le client génère un pre-master secret aléatoire.
- Il le chiffre avec la clé publique RSA du serveur (du certificat).
- 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.
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 :
génère clé privée éphémère c
calcule C = c·G
ClientHello : key_share C
ServerHello : key_share S
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é :
- Client :
secret = c · S = c · s · G - Serveur :
secret = s · C = s · c · G
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 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 |
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.
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
| Suite | Algorithme AEAD | Hash (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) |
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 (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 (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
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 |
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.
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
ClientHello + psk_identity
(ticket de la session précédente)
déchiffre le ticket,
retrouve le master secret
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.
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.
ClientHello + psk_identity
+ Early Data (0-RTT)
traite Early Data
pendant le handshake
ServerHello + Finished
+ EndOfEarlyData
Comparatif des modes de connexion
| Mode | RTT avant données | Forward Secrecy | Protection 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 |
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
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.
ClientHello
SNI: "blog.example.com"
IP: 203.0.113.1
(héberge blog + shop + api)
blog.example.com
ALPN — Application-Layer Protocol Negotiation
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
| Identifiant | Protocole | Usage |
|---|---|---|
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) |
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 :
- Quel domaine est demandé → choix du certificat (SNI)
- Quel protocole sera utilisé → préparation du contexte applicatif (ALPN)
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
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
| Directive | Effet |
|---|---|
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 |
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.
max-age en test.
CAA — Certification Authority Authorization
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 CAA | Signification |
|---|---|
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
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.
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.
(périodiquement)
répond : "valid"
signé jusqu'à J+7
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 :
- Zéro latence OCSP pour le client
- Protection vie privée : le CA ne voit pas qui visite quoi
- Résilience : fonctionne même si le répondeur OCSP du CA est indisponible
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)
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).
| Aspect | Dé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)
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.
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)
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.
BREACH — Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext (2013)
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.
| Attaque | Cible | Correction principale | TLS 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) |
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é |
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écanisme | Configuration cible | Priorité |
|---|---|---|
| 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 |
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 :
- Les données au repos sur le serveur (chiffrement de base de données, disques)
- Les données en mémoire du serveur (attaques Heartbleed-like, accès root)
- La validité du contenu servi (un certificat valide ne prouve pas que le site est légitime)
- Les métadonnées de trafic : volumes, timing, destinations (visible malgré TLS)
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.