Aller au contenu

La poignée de main TLS 1.3 en une page

Deux machines qui ne se sont jamais vues conviennent d’un secret sous les yeux de tout le réseau, en un seul aller-retour, et sans que ce secret circule jamais : c’est plus de discrétion qu’on n’en obtient d’un dîner de famille.

Schéma animé d'une poignée de main TLS 1.3 entre un client (un navigateur) et un serveur (site.exemple), en six étapes. Un : le client envoie en clair un ClientHello avec les versions, les suites proposées et un key_share, sa clé publique éphémère ; le nom du site, le SNI site.exemple, y passe en clair. Deux : le serveur répond en clair par un ServerHello avec la suite choisie et son propre key_share. Trois : de chaque côté, la clé privée de chacun combinée au key_share reçu donne le même secret (ECDHE), d'où HKDF tire les clés ; ce secret n'a jamais circulé. Quatre : le serveur envoie, déjà chiffrés, EncryptedExtensions, Certificate, CertificateVerify et Finished : le certificat est chiffré. Cinq : le client vérifie le certificat, la signature et le Finished, puis envoie son propre Finished, chiffré. Six : les données applicatives circulent chiffrées dans les deux sens, après un seul aller-retour, marqué par une accolade côté client. Légende : en clair, les deux Hello, SNI compris ; chiffré, tout le reste. Encart 0-RTT : en reprise de session, des données partent avec le ClientHello ; un attaquant peut les rejouer, elles sont donc réservées aux requêtes sans effet de bord.

  • TLS 1.3 est défini par la RFC 8446 (2018). La poignée de main nominale tient en un aller-retour (1-RTT) : le client envoie sa part de clé dès le premier message, sans attendre qu’on la lui demande.
  • Dans une poignée de main complète, l’échange de clé est toujours éphémère (ECDHE ou DHE) : voler plus tard la clé privée du serveur ne permet pas de déchiffrer les sessions enregistrées. C’est la confidentialité persistante, devenue obligatoire.
  • Le certificat du serveur sert à prouver son identité, pas à chiffrer : le message CertificateVerify est une signature sur tout l’échange précédent, faite avec la clé privée du certificat.
  • Tout ce qui suit le ServerHello est chiffré, certificat compris. En TLS 1.2, le certificat voyageait en clair.
  • Les deux Finished scellent la conversation : chacun calcule une empreinte de tous les messages échangés, et une modification en route, même d’un Hello en clair, fait échouer la poignée de main.
  • La version 1.3 a supprimé l’échange de clé par chiffrement RSA, les suites CBC, RC4, la compression et la renégociation. Il ne reste que des chiffrements authentifiés (AES-GCM, ChaCha20-Poly1305, AES-CCM).
  • Si le serveur ne prend pas en charge le groupe de la clé envoyée, il répond par un HelloRetryRequest et la poignée de main coûte un aller-retour de plus.
  • Le 0-RTT, permis lors d’une reprise de session, envoie des données avec le premier message. Ces données peuvent être rejouées par un attaquant : on les réserve aux requêtes sans effet de bord (HTTP prévoit pour cela le code 425 Too Early, RFC 8470).

Pour aller plus loin : Comprendre TLS : mécanismes, garanties et limites · Sécuriser un canal : TLS, HTTPS et mTLS · Établir une clé : Diffie-Hellman, KEM et HPKE · QUIC, HTTP moderne, TLS et proxys applicatifs · Migrer TLS legacy sans casser les clients anciens · Intégrer la cryptographie post-quantique dans TLS · Attaque de l’intercepteur et proxy TLS · Pare-feu, architectures et NAT en une page.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.