<?xml version="1.0" encoding="utf-8"?>
<rfcdesc title="The Transport Layer Security (TLS) Protocol Version 1.3" num="9846" wg="tls" status="standards">
  <authors><author>E. Rescorla (Independent)</author></authors>
  <rfcdate><month>July</month><year>2026</year></rfcdate>
  <date>2026-07-12</date>
<content>
  <p>Ce RFC met à jour la norme de la version 1.3 du protocole de
  <wikipedia>cryptographie</wikipedia> <wikipedia name="Transport
  Layer Security">TLS</wikipedia>. Il n'y a pas de grand changement
  par rapport à son prédécesseur, le <rfc num="8446"
  local="true"/>.</p>
  <p>Regardons un peu en détail le protocole TLS 1.3.  Revenons
  d'abord sur les fondamentaux : <wikipedia name="Transport Layer
  Security">TLS</wikipedia> est un mécanisme permettant aux
  applications <wikipedia
  name="Client–serveur">client/serveur</wikipedia> de communiquer au
  travers d'un réseau non sûr (par exemple
  l'<wikipedia>Internet</wikipedia>) tout en empêchant l'écoute et la
  modification des messages. TLS suppose un mécanisme sous-jacent pour
  acheminer les bits dans l'ordre, et sans perte. En général, ce
  mécanisme est <wikipedia name="Transmission Control
  Protocol">TCP</wikipedia> (mais une partie de TLS est aussi utilisée
  pour <wikipedia>QUIC</wikipedia>). Avec ce mécanisme de <wikipedia
  name="Couche 4">transport</wikipedia>, et les techniques <wikipedia
  name="Cryptographie">cryptographiques</wikipedia> mises en œuvre par
  dessus, TLS garantit :
  <enum>
    <item>L'<wikipedia>authentification</wikipedia> du serveur (celle
    du client est facultative), authentification qui permet d'empêcher
    l'<wikipedia name="Attaque de l'homme du milieu">attaque de
    l'intermédiaire</wikipedia>, et qui se fait en général via la
    <wikipedia name="Cryptographie asymétrique">cryptographie
    asymétrique</wikipedia>,</item>
    <item>La <wikipedia>confidentialité</wikipedia> des données
      (mais attention, TLS ne masque pas la
      <emphasis>taille</emphasis> des données, permettant certaines
      analyses de trafic),</item>
    <item>L'<wikipedia name="Intégrité
    (cryptographie)">intégrité</wikipedia> des données (qui est
    inséparable de l'authentification : il ne servirait pas à
    grand'chose d'être sûr de l'identité de son correspondant, si les
    données pouvaient être modifiées en route).</item>
    </enum>
  Ces propriétés sont vraies même si l'attaquant contrôle complètement
  le réseau entre le client et le serveur (le <wikipedia name="Modèle
  de menace">modèle de menace</wikipedia> est détaillé dans la section
  3 - surtout la 3.3 - du <rfc num="3552" local="true"/>, et dans
  l'annexe F de notre RFC).</p>
  <p>TLS est un protocole gros et compliqué (ce qui n'est pas
  forcément optimum pour la sécurité). Le RFC fait 161 pages. Pour
  dompter cette complexité, TLS est séparé en deux composants :
  <enum>
      <item>Le protocole de salutation (<foreign>handshake
      protocol</foreign>), chargé d'organiser les échanges du début,
      qui permettent de choisir les paramètres de la session (c'est
      un des points délicats de TLS, et plusieurs failles de sécurité
      ont déjà été trouvées dans ce protocole pour les anciennes
      versions de TLS),</item>
      <item>Et le protocole des enregistrements (<foreign>record
      protocol</foreign>), au plus bas niveau, chargé d'acheminer les
      données chiffrées.</item>
  </enum>
  Pour comprendre le rôle de ces deux protocoles, imaginons un
  protocole fictif simple, qui n'aurait qu'un seul algorithme de
  <wikipedia name="Cryptographie symétrique">cryptographie
  symétrique</wikipedia>, et qu'une seule clé, connue des deux parties
  (par exemple dans leur fichier de configuration). Avec un tel
  protocole, on pourrait se passer du protocole de salutation, et
  n'avoir qu'un protocole des enregistrements, indiquant comment
  encoder les données chiffrées. Le client et le serveur pourraient se
  mettre à communiquer immédiatement, sans salutation, poignée de
  mains et négociation, réduisant ainsi la <link
  local="latence">latence</link>. Un tel protocole serait très simple,
  donc sa sécurité serait bien plus facile à analyser, ce qui est une
  bonne chose. Mais il n'est pas du tout réaliste : changer la clé
  utilisée serait complexe (il faudrait synchroniser exactement les
  deux parties), remplacer l'algorithme si la
  <wikipedia>cryptanalyse</wikipedia> en venait à bout (comme c'est
  arrivé à <wikipedia>RC4</wikipedia>, cf. <rfc num="7465"
  local="true"/>) créerait un nouveau protocole incompatible avec
  l'ancien, communiquer avec un serveur qu'on n'a jamais vu serait
  impossible (puisque on ne partagerait pas de clé commune), etc. D'où
  la nécessité du protocole de salutation, où les partenaires :
  <enum>
    <item>S'authentifient avec leur <wikipedia name="Cryptographie
    asymétrique">clé publique</wikipedia> (ou, si on veut faire comme
    dans le protocole fictif simple, avec une clé secrète
    partagée),</item>
    <item>Sélectionnent l'algorithme de <wikipedia name="Cryptographie
    symétrique">cryptographie symétrique</wikipedia> qui va <wikipedia
    name="Chiffrement">chiffrer</wikipedia> la session, ainsi que ses
    paramètres divers,</item>
    <item>Choisissent la clé de la session TLS (et c'est là que se sont
    produites les plus grandes bagarres lors de la conception de TLS
    1.3).</item>
    </enum></p>
  <p>Notez que TLS n'est en général pas utilisé tel quel mais via un
  protocole de haut niveau, comme <wikipedia name="HyperText Transfer
  Protocol Secure">HTTPS</wikipedia> pour sécuriser <wikipedia
  name="Hypertext Transfer Protocol">HTTP</wikipedia>. TLS ne suppose
  pas un usage particulier : on peut s'en servir pour HTTP, pour
  <wikipedia name="Simple Mail Transfer Protocol">SMTP</wikipedia>
  (<rfc num="7672" local="true"/>), pour le <wikipedia name="Domain
  Name System">DNS</wikipedia> (<rfc num="7858" local="true"/>),
  etc. Cette intégration dans un protocole de plus haut niveau pose
  parfois elle-même des surprises en matière de sécurité, par exemple
  si l'application utilisatrice ne fait pas attention à la sécurité
  (Voir <link
  url="https://web.archive.org/web/20220123025713/http://blog.soat.fr/2014/04/devoxx-2014-utiliser-tls-sans-se-tromper-une-conference-animee-par-stephane-bortzmeyer/">mon
  exposé à Devoxx</link>, et <file
  name="bortzmeyer-tls-devoxx.odp">ses transparents</file>.)</p>
  <p>TLS 1.3 est plutôt un nouveau protocole qu'une nouvelle
    version, et il n'est pas directement compatible avec son
    prédécesseur, TLS 1.2 (une
    application qui ne connait que 1.3 ne peut pas parler avec une
    application qui ne connait que 1.2.) En pratique, les
    <wikipedia name="Bibliothèque logicielle">bibliothèques</wikipedia> qui mettent en œuvre TLS
    incluent en général les différentes versions, et un mécanisme de
    négociation de la version utilisée permet normalement de découvrir
    la version maximum que les deux parties acceptent (historiquement,
    plusieurs failles sont venues de ce point, avec des
    <wikipedia name="Pare-feu (informatique)">pare-feux</wikipedia> stupidement configurés qui
    interféraient avec la négociation).</p>
  <p>La section 1.3 de notre RFC liste les différences importantes
  entre TLS 1.2 (qui était normalisé dans le <rfc num="5246"
  local="true"/>) et 1.3 :
  <enum>
    <item>La liste des algorithmes de <wikipedia name="Cryptographie symétrique">cryptographie
      symétrique</wikipedia> acceptés a été violemment
      réduite. Beaucoup trop longue en TLS 1.2, offrant trop de choix, comprenant plusieurs
      algorithmes faibles, elle ouvrait la voie à des
      <wikipedia xml:lang="en" name="Downgrade attack">attaques par repli</wikipedia>. Les « survivants » de
      ce nettoyage sont tous des algorithmes à <wikipedia
      name="Chiffrement authentifié">chiffrement intègre</wikipedia>.</item>
    <item>Un nouveau service apparait, 0-RTT (<foreign>zero
      round-trip time</foreign>, la possibilité d'établir une session
      TLS avec un seul paquet, en envoyant les données tout de suite),
      qui réduit la <link local="latence">latence</link> du
      début de l'échange. Attention, rien n'est gratuit en ce monde,
      et 0-RTT présente des nouveaux dangers, et ce nouveau service a
      été <link url="https://github.com/tlswg/tls13-spec/issues/1001">un des plus controversés</link> lors de la mise au point de TLS
      1.3, entrainant de nombreux débats à l'<wikipedia name="Internet Engineering Task Force">IETF</wikipedia>.</item>
    <item>Désormais, la <wikipedia name="Confidentialité persistante">sécurité
      future</wikipedia> est systématique, la compromission d'une clé
      secrète ne permet plus de déchiffrer les anciennes
      communications. Plus de clés publiques statiques, tout se fera
      par <wikipedia xml:lang="en" name="Ephemeral key">clés
      éphémères</wikipedia>. C'était le point qui a suscité le plus de débats
      à l'IETF, car cela complique sérieusement la surveillance (ce
      qui est bien le but) et le <link
      local="crypto-debug">débogage</link>. L'<wikipedia name="European Telecommunications Standards Institute">ETSI</wikipedia>,
      représentante du patronat, a même normalisé son propre TLS
      délibérément affaibli, <link url="https://www.etsi.org/news-events/news/1358-2018-11-press-etsi-releases-standards-for-enterprise-security-and-data-centre-management">eTLS</link>.</item>
    <item>Plusieurs messages de négociation qui étaient auparavant en
    clair sont désormais chiffrés. Par contre, l'indication du nom du
    serveur (SNI, section 3 du <rfc num="6066" local="true"/>) reste
    en clair, sauf si on utilise le tout nouveau ECH
    (<foreign>Encrypted Client Hello</foreign>), normalisé en même
    temps que ce RFC, dans le <rfc num="9849" local="true"/> (cf. son
    cahier des charges dans le <rfc num="8744" local="true"/>.)</item>
      <item>Les fonctions de <wikipedia name="Fonction de dérivation de clé">dérivation de clé</wikipedia>
      ont été refaites.</item>
      <item>La <wikipedia name="Automate fini">machine à états</wikipedia> utilisée pour
      l'établissement de la connexion également (elle est détaillée
      dans l'annexe A du RFC).</item>
      <item>Les algorithmes <wikipedia name="Cryptographie
      asymétrique">asymétriques</wikipedia> à <wikipedia name="Cryptographie sur les courbes elliptiques">courbes
      elliptiques</wikipedia> font maintenant partie de la définition
      de base de TLS (cf. <rfc num="7748" local="true"/>), et on voit arriver des nouveaux comme
      <wikipedia xml:lang="en" name="EdDSA" anchor="Ed25519">ed25519</wikipedia> (cf. <rfc num="8422" local="true"/>).</item>
      <item>Par contre, <wikipedia name="Digital Signature Algorithm">DSA</wikipedia> a été
      retiré.</item>
      <item>Le mécanisme de négociation du numéro de version
      (permettant à deux machines n'ayant pas le même jeu de versions
      TLS de se parler) a changé. L'ancien était très bien mais, mal
      implémenté, il a suscité beaucoup de problèmes
      d'interopérabilité. Le nouveau est censé mieux gérer les
      innombrables systèmes bogués qu'on trouve sur l'Internet (la
      bogue ne provenant pas tant de la bibliothèque TLS utilisée que
      des <wikipedia name="Pare-feu
      (informatique)">pare-feux</wikipedia> mal programmés et mal
      configurés qui sont souvent mis devant). J'en profite pour vous
      recommander l'article « <link
      url="https://openweb.eu.org/articles/https-de-ssl-a-tls-1-3">HTTPS :
      de SSL à TLS 1.3</link> », sur ce sujet de la négociation de
      version.</item>
      <item>La reprise d'une session TLS précédente fait l'objet
      désormais d'un seul mécanisme, qui est le même que celui pour
      l'usage de clés pré-partagées. La négociation TLS peut en effet
      être longue, en terme de latence, et ce mécanisme permet
      d'éviter de tout recommencer à chaque connexion. Deux machines
      qui se parlent régulièrement peuvent ainsi gagner du
      temps.</item>
      </enum> Un bon résumé de ce protocole est
      dans <link
      url="https://blog.apnic.net/2017/12/12/internet-protocols-changing/">l'article
      de Mark Nottingham</link>.</p>
    <p>Ce RFC concerne TLS 1.3 mais il contient aussi quelques
    changements pour la version 1.2 (section 1.4 du RFC), comme un
    mécanisme pour limiter les <wikipedia xml:lang="en" name="Downgrade attack">attaques par
    repli</wikipedia> portant sur le numéro de version, et des
    mécanismes de la 1.3 « portés » vers la 1.2 sous forme
    d'extensions TLS.</p>
  <p>Et les changements depuis le <rfc num="8446" local="true"/>, le
  premier qui avait normalisé TLS 1.3 ? Ils sont peu importants, le
  plus spectaculaire étant le remplacement de toutes les occurrences de
  <foreign>master</foreign> par <foreign>main</foreign> dans les noms
  de variable. Ainsi, <computer>resumption_master_secret</computer>
  est devenu <computer>resumption_secret</computer> et le
  <computer>extended_master_secret</computer> du <rfc num="7627"/> est
  devenu <computer>extended_main_secret</computer>. Il s'agissait de
  répondre à une obsession étatsunienne mais je ne sais pas si ce
  changement sera propagé dans les programmes qui mettent en œuvre
  TLS (noms des variables et texte affiché, regardez l'exemple
  <wikipedia>Wireshark</wikipedia> plus bas). Tous ces changements depuis le <rfc num="8446" local="true"/>
  sont résumés dans la section 1.2 mais il s'agit surtout de détails
  et de précisions : la version 1.3 du protocole ne change pas.
  </p>
  <p>La section 2 du RFC est un survol général de TLS 1.3 (le RFC
    fait 161 pages, et peu de gens le liront intégralement). Au début
    d'une session TLS, les deux parties, avec le protocole de salutation, négocient les paramètres
    (version de TLS, algorithmes cryptographiques) et définissent les
    clés qui seront utilisées pour le chiffrement de la
    session. En simplifiant, il y a trois phases dans l'établissement
    d'une session TLS :
  <enum>
    <item>Définition des clés de session, et des paramètres
      cryptographiques, le client envoie un
      <computer>ClientHello</computer>, le serveur répond avec un <computer>ServerHello</computer>,</item>
    <item>Définition des autres paramètres (par exemple
      l'application utilisée au-dessus de TLS, ou bien la demande
      <computer>CertificateRequest</computer> d'un certificat client), cette partie est
      chiffrée, contrairement à la précédente,</item>
    <item>Authentification du serveur, avec le message
      <computer>Certificate</computer> (qui ne contient pas
      forcément un certificat, cela peut être une clé brute - <rfc
      num="7250" local="true"/> ou une clé d'une session précédente -
      <rfc num="7924" local="false"/>).</item>
    </enum>
    Un message <computer>Finished</computer> termine cette ouverture
    de session. 
    (Si vous êtes fana de futurisme, notez que seule la première étape
    pourrait être remplacée par la <wikipedia name="Distribution quantique de clé">distribution quantique
    de clés</wikipedia>, les autres resteraient
    indispensables. Contrairement à ce que promettent ses promoteurs,
    la <wikipedia name="Distribution quantique de clé">QKD</wikipedia> ne dispense pas d'utiliser les protocoles existants.)
    </p>
    <p>Comment les deux parties se mettent-elles d'accord sur
    les clés ? Trois méthodes :
    <enum>
      <item><wikipedia xml:lang="en" name="Diffie–Hellman key exchange">Diffie-Hellman sur courbes elliptiques</wikipedia> qui sera sans doute la plus fréquente,</item>
      <item><wikipedia xml:lang="en" name="Pre-shared key">Clé pré-partagée</wikipedia>,</item>
      <item>Clé pré-partagée avec Diffie-Hellman,</item>
      <item>Et la méthode <wikipedia name="Rivest Shamir Adleman">RSA</wikipedia>, elle, disparait
      de la norme (mais RSA peut toujours être utilisé pour
      l'authentification, autrement, cela ferait beaucoup de
      certificats à jeter…)</item>
    </enum> </p>
  <p>Si vous connaissez la cryptographie, vous savez que les
  <wikipedia xml:lang="en" name="Pre-shared key">PSK</wikipedia>, les
  clés partagées, sont difficiles à gérer, puisque devant être
  transmises de manière sûre avant l'établissement de la
  connexion. Mais, dans TLS, une autre possibilité existe : si une
  session a été ouverte sans PSK, en n'utilisant que de la
  cryptographie asymétrique, elle peut être enregistrée, et resservir,
  afin d'ouvrir les futures discussions plus rapidement. TLS 1.3
  utilise le même mécanisme pour des « vraies » PSK, et pour celles
  issues de cette reprise de sessions précédentes (contrairement aux
  précédentes versions de TLS, qui utilisaient un mécanisme séparé,
  celui du <rfc num="5077"/>, désormais abandonné).</p> <p>Si on a une
  PSK (gérée manuellement, ou bien via la reprise de session), on peut
  même avoir un dialogue TLS dit « 0-<wikipedia name="Round-Trip delay
  Time">RTT</wikipedia> ». Le premier paquet du client peut contenir
  des données, qui seront acceptées et traitées par le serveur. Cela
  permet une importante diminution de la <link
  local="latence">latence</link>, dont il faut rappeler qu'elle est
  souvent le facteur limitant des performances. Par contre, comme rien
  n'est idéal dans cette vallée de larmes, cela se fait au détriment
  de la sécurité :
    <enum>
      <item>Plus de <wikipedia name="Confidentialité persistante">confidentialité
      persistante</wikipedia>, si la PSK est compromise plus tard, la
      session pourra être déchiffrée,</item>
      <item>Le <wikipedia name="Attaque par rejeu">rejeu</wikipedia> devient possible, et
      l'application doit donc savoir gérer ce problème.</item>
    </enum>
    La section 8 du RFC et l'annexe F.5 détaillent ces limites, et les
    mesures qui peuvent être prises.
    </p>
  <p>Le protocole TLS est décrit avec un langage spécifique, décrit de
  manière relativement informelle dans la section 3 du RFC. Ce langage
  manipule des types de données classiques :
    <enum>
      <item>Scalaires 
      (<computer>uint8</computer>, <computer>uint16</computer>),</item>
      <item>Tableaux, de taille fixe - <computer>Datum[3]</computer> ou
    variable, avec indication de la longueur au début -
      <computer>uint16 longer&lt;0..800&gt;</computer>,</item>
      <item>Énumérations (<computer>enum { red(3), blue(5), white(7) }
      Color;</computer>),</item>
      <item>Enregistrements structurés, y compris avec variantes (la
      présence de certains champs dépendant de la valeur d'un champ).</item>
    </enum>
    Par exemple, tirés de la section 4 (l'annexe B fournit la liste complète), voici, dans ce langage, la
    liste des types de messages pendant les salutations, une énumération :
    <code>
       enum {
          client_hello(1),
          server_hello(2),
          new_session_ticket(4),
          end_of_early_data(5),
          encrypted_extensions(8),
          certificate(11),
          certificate_request(13),
          certificate_verify(15),
          finished(20),
          key_update(24),
          message_hash(254),
          (255)
      } HandshakeType;
    </code>
    Et le format de base d'un message du protocole de salutation :
    <code>
      struct {
          HandshakeType msg_type;    /* handshake type */
          uint24 length;             /* bytes in message */
          select (Handshake.msg_type) {
              case client_hello:          ClientHello;
              case server_hello:          ServerHello;
              case end_of_early_data:     EndOfEarlyData;
              case encrypted_extensions:  EncryptedExtensions;
              case certificate_request:   CertificateRequest;
              case certificate:           Certificate;
              case certificate_verify:    CertificateVerify;
              case finished:              Finished;
              case new_session_ticket:    NewSessionTicket;
              case key_update:            KeyUpdate;
          };
      } Handshake;     
    </code></p>
    <p>La section 4 fournit tous les détails sur le protocole de
    salutation, notamment sur la délicate négociation des paramètres
    cryptographiques. Notez que la <link
    local="tls-renego">renégociation en cours de session</link> a
    disparu, donc un <computer>ClientHello</computer> ne peut
    désormais plus être envoyé qu'au début.</p>
  <p>Un problème auquel a toujours dû faire face TLS est celui de la
  négociation de version, en présence de mises en œuvre boguées, et,
  surtout, en présence de <wikipedia xml:lang="en"
  name="Middlebox">boitiers intermédiaires</wikipedia> encore plus
  bogués (<wikipedia name="Pare-feu
  (informatique)">pare-feux</wikipedia> ignorants, par exemple, que
  des <wikipedia name="Direction des systèmes
  d'information">DSI</wikipedia> ignorantes placent un peu
  partout). Le modèle original de TLS pour un client était d'annoncer
  dans le <computer>ClientHello</computer> le plus grand numéro de
  version qu'on gère, et de voir dans <computer>ServerHello</computer>
  le maximum imposé par le serveur. Ainsi, un client TLS 1.2 parlant à
  un serveur qui ne gère que 1.1 envoyait
  <computer>ClientHello(client_version=1.2)</computer> et, en recevant
  <computer>ServerHello(server_version=1.1)</computer>, se repliait
  sur TLS 1.1, la version la plus élevée que les deux parties
  gèraient. En pratique, cela ne marche pas aussi bien. On voyait par
  exemple des serveurs (ou, plus vraisemblablement, des pare-feux
  bogués) qui raccrochaient brutalement en présence d'un numéro de
  version plus élevé, au lieu de suggérer un repli. Le client n'avait
  alors que le choix de renoncer, ou bien de se lancer dans une série
  d'essais/erreurs (qui peut être longue, si le serveur ou le pare-feu
  bogué ne répond pas).</p> <p>TLS 1.3 change donc complètement le
  mécanisme de négociation. Le client annonce toujours la version 1.2
  (en fait 0x303, pour des raisons historiques), et la vraie version
  est mise dans une extension, <computer>supported_versions</computer>
  (section 4.2.1), dont on espère qu'elle sera ignorée par les
  serveurs mal gérés. (L'annexe D du RFC détaille ce problème de la
  négociation de version.) Dans la réponse
  <computer>ServerHello</computer>, un serveur 1.3 doit inclure cette
  extension, autrement, il faut se rabattre sur TLS 1.2.</p> <p>En
  parlant d'extensions, concept qui avait été introduit originellement
  dans le <rfc num="4366" local="true"/>, notre RFC reprend des
  extensions déjà normalisées, comme le SNI (<foreign>Server Name
  Indication</foreign>) du <rfc num="6066" local="true"/>, le
  battement de cœur du <rfc num="6520" local="true"/>, le remplissage
  du <computer>ClientHello</computer> du <rfc num="7685"
  local="false"/>, et en ajoute dix, dont
  <computer>supported_versions</computer>. Certaines de ces extensions
  doivent être présentes dans les messages <computer>Hello</computer>,
  car la sélection des paramètres cryptographiques en dépend, d'autres
  peuvent être uniquement dans les messages
  <computer>EncryptedExtensions</computer>, une nouveauté de TLS 1.3,
  pour les extensions qu'on n'enverra qu'une fois le chiffrement
  commencé. Le RFC en profite pour rappeler que les messages
  <computer>Hello</computer> ne sont pas protégés cryptographiquement,
  et peuvent donc être modifiés (le message
  <computer>Finished</computer> résume les décisions prises et peut
  donc protéger contre ce genre d'attaques).</p> <p>Autrement, parmi
  les autres nouvelles extensions :
    <enum>
      <item>Le petit gâteau (<foreign>cookie</foreign>), pour tester
      la joignabilité,</item>
      <item>Les données précoces (<foreign>early data</foreign>),
      extension qui
      permet d'envoyer des données dès le premier message (« <foreign>O-RTT</foreign> »), réduisant
      ainsi la <link local="latence">latence</link>, un peu comme le
      fait le <foreign>TCP Fast Open</foreign> du <rfc num="7413"
      local="true"/>,</item>
      <item>Liste des <wikipedia>AC</wikipedia> (<foreign>certificate
      authorities</foreign>), qui, en indiquant la liste des AC
      connues du client, peut aider le serveur à choisir un certificat
      qui sera validé (par exemple en n'envoyant le certificat <link
      local="cacert">CAcert</link> que si le client connait cette AC).</item>
    </enum></p>
    <p>La section 5 décrit le protocole des enregistrements
    (<foreign>record protocol</foreign>). C'est ce sous-protocole qui
    va prendre un flux d'octets, le découper en enregistrements, les
    protéger par le chiffrement puis, à l'autre bout, déchiffrer et
    reconstituer le flux… Notez que « protégé » signifie à la fois
    <wikipedia>confidentialité</wikipedia> et
    <wikipedia name="Intégrité (cryptographie)">intégrité</wikipedia> puisque TLS 1.3, contrairement à
    ses prédécesseurs, impose <wikipedia name="Chiffrement authentifié">AEAD</wikipedia> (<rfc
    num="5116" local="false"/>).</p>
    <p>Les enregistrements sont typés et marqués
    <foreign>handshake</foreign> (la salutation, vue dans la section
    précédente), <foreign>change cipher spec</foreign>,
    <foreign>alert</foreign> (pour signaler un problème) et
    <foreign>application data</foreign> (les données elle-mêmes) :
    <code>
enum {
          invalid(0),
          change_cipher_spec(20),
          alert(21),
          handshake(22),
          application_data(23),
          (255)
      } ContentType;
    </code>
    Le contenu des données est évidemment incompréhensible, en raison
    du chiffrement (voici un enregistrement de type 23, données, vu
    par <wikipedia name="Wireshark">tshark</wikipedia>) :
    <code>
    TLSv1.3 Record Layer: Application Data Protocol: http-over-tls
        Opaque Type: Application Data (23)
        Version: TLS 1.2 (0x0303)
        Length: 6316
        Encrypted Application Data: eb0e21f124f82eee0b7a37a1d6d866b075d0476e6f00cae7...
    </code>
    Et décrite par la norme dans son langage formel :
    <code>
struct {
          ContentType opaque_type = application_data; /* 23 */
          ProtocolVersion legacy_record_version = 0x0303; /* TLS v1.2 */
          uint16 length;
          opaque encrypted_record[TLSCiphertext.length];
      } TLSCiphertext;
    </code> (Oui, le numéro de version reste à TLS 1.2 pour éviter
    d'énerver les stupides <foreign><wikipedia xml:lang="en" name="Middlebox">middleboxes</wikipedia></foreign>.)
    Notez que des
    extensions à TLS peuvent introduire d'autres types
    d'enregistrements.</p>
  <p>Une faiblesse classique de TLS est que la taille des données
  chiffrées n'est pas dissimulée. Si on veut savoir à quelle page d'un
  site Web un client HTTP a accédé, on peut parfois
  le déduire de l'observation de cette taille. D'où la
  possibilité de faire du <wikipedia name="Remplissage
  (cryptographie)">remplissage</wikipedia> pour dissimuler cette
  taille (section 5.4 du RFC).  Notez que le RFC ne suggère pas de
  politique de remplissage spécifique (ajouter un nombre aléatoire ?
  Tout remplir jusqu'à la taille maximale ?), c'est un choix
  compliqué. Il note aussi que certaines applications font leur propre
  remplissage, et qu'il n'est alors pas nécessaire que TLS le
  fasse.</p>
  <p>La section 6 du RFC est dédiée au cas des alertes. C'est un des
  types d'enregistrements possibles, et, comme les autres, il est
  chiffré, et les alertes sont donc confidentielles. Une alerte a un
  niveau et une description :
    <code>
struct {
          AlertLevel level;
          AlertDescription description;
      } Alert;
    </code>
  Le niveau indiquait si l'alerte est fatale mais n'est plus utilisé
  en TLS 1.2, où il faut se fier uniquement à la description, une
  énumération des problèmes possibles (message de type inconnu,
  mauvais certificat, enregistrement non décodable - rappelez-vous que
  TLS 1.3 n'utilise que du <wikipedia 
  name="Chiffrement authentifié">chiffrement intègre</wikipedia> -,
  problème interne au client ou au serveur, extension non acceptée,
  etc). La section 6.2 donne une liste des erreurs fatales, qui
  doivent mener à terminer immédiatement la session TLS.</p>
  <p>La section 8 du RFC est entièrement consacrée à une nouveauté
  délicate, le « 0-<wikipedia name="Round-Trip delay
  Time">RTT</wikipedia> ». Ce terme désigne la possibilité d'envoyer
  des données dès le premier paquet, sans les nombreux échanges de
  paquets qui sont normalement nécessaires pour établir une session
  TLS. C'est très bien du point de vue des performances, mais pas
  forcément du point de vue de la sécurité puisque, sans échanges, on
  ne peut plus vérifier à qui on parle. Un attaquant peut réaliser une
  <wikipedia name="Attaque par rejeu">attaque par rejeu</wikipedia> en
  envoyant à nouveau un paquet qu'il a intercepté. Un serveur doit
  donc se défendre en se souvenant des données déjà envoyées et en ne
  les acceptant pas deux fois. (Ce qui peut être plus facile à dire
  qu'à faire ; le RFC contient une bonne discussion très détaillée des
  techniques possibles, et de leurs limites. Il y en a des subtiles,
  comme d'utiliser des systèmes de mémorisation ayant des faux
  positifs, comme les <wikipedia name="Filtre de Bloom">filtres de
  Bloom</wikipedia>, parce qu'ils ne produiraient pas d'erreurs, ils
  rejetteraient juste certains essais 0-RTT légitimes, cela ne serait
  donc qu'une légère perte de performance.)</p>
  <p>La section 9 de notre RFC se penche sur un problème difficile, la
  conformité des mises en œuvres de TLS. D'abord, les algorithmes
  obligatoires. Afin de permettre l'interopérabilité,
  <emphasis>toute</emphasis> mise en œuvre de TLS doit avoir la suite
  de chiffrement <computer>TLS_AES_128_GCM_SHA256</computer>
  (<wikipedia name="Advanced Encryption Standard">AES</wikipedia> en
  mode <wikipedia name="Galois/Counter Mode">GCM</wikipedia> avec
  <wikipedia>SHA-256</wikipedia>). D'autres suites sont recommandées
  (cf. annexe B.4). Pour l'authentification, <wikipedia name="Rivest
  Shamir Adleman">RSA</wikipedia> avec <wikipedia>SHA-256</wikipedia>
  et <wikipedia name="Elliptic curve digital signature
  algorithm">ECDSA</wikipedia> sont obligatoires. Ainsi, deux
  programmes différents sont sûrs de pouvoir trouver des algorithmes
  communs.<!-- Aucun algo Bernstein obligatoire --> La possibilité
  d'authentification par certificats <wikipedia name="Pretty Good
  Privacy">PGP</wikipedia> du <rfc num="6091" local="true"/> a été
  retirée.</p>
  <p>De plus, certaines extensions à TLS sont obligatoires, un pair
  TLS 1.3 ne peut pas les refuser :
    <enum>
      <item><computer>supported_versions</computer>, nécessaire pour
      annoncer TLS 1.3,</item>
      <item><computer>cookie</computer>,</item>
      <item><computer>signature_algorithms</computer>,
      <computer>signature_algorithms_cert</computer>,
      <computer>supported_groups</computer> et
      <computer>key_share</computer>,</item>
      <item><computer>server_name</computer>, c'est à dire SNI
      (<foreign>Server Name Indication</foreign>), souvent nécessaire
      pour pouvoir choisir le bon certificat (cf. section 3 du <rfc
      num="6066" local="true"/>).</item>
    </enum></p>
  <p>La section 9 précise aussi le comportement attendu des <wikipedia
  xml:lang="en" name="Middlebox">équipements
  intermédiaires</wikipedia>. Ces dispositifs (<wikipedia
  name="Pare-feu (informatique)">pare-feux</wikipedia>, par exemple,
  mais pas uniquement) ont toujours été une plaie pour TLS. Alors que
  TLS vise à fournir une communication sûre, à l'abri des équipements
  intermédiaires, ceux-ci passent leur temps à essayer de s'insérer
  dans la communication, et souvent la cassent. Normalement, TLS 1.3
  est conçu pour que ces interférences ne puissent pas mener à un
  repli (le repli est l'utilisation de paramètres moins sûrs que ce
  que les deux machines auraient choisi en l'absence
  d'interférence).</p>
  <p>Il y a deux grandes catégories d'intermédiaires, ceux qui
  tripotent la session TLS sans être le client ou le serveur, et ceux
  qui terminent la session TLS de leur côté. Attention, dans ce
  contexte, « terminer » ne veut pas dire « y mettre fin », mais « la
  sécurité TLS se termine ici, de manière à ce que l'intermédiaire
  puisse accéder au contenu de la communication ». Typiquement, une
  <foreign><wikipedia xml:lang="en"
  name="Middlebox">middlebox</wikipedia></foreign> qui « termine » une
  session TLS va être serveur TLS pour le client et client TLS pour le
  serveur, s'insérant complètement dans la conversation. Normalement,
  l'authentification vise à empêcher ce genre de pratiques, et
  l'intermédiaire ne sera donc accepté que s'il a un certificat
  valable. C'est pour cela qu'en entreprise, les machines officielles
  sont souvent installées avec une <wikipedia>AC</wikipedia> contrôlée
  par le vendeur du boitier intermédiaire, de manière à permettre
  l'interception.</p>
  <p>Le RFC ne se penche pas sur la légitimité de ces pratiques,
    uniquement sur leurs caractéristiques techniques. (Les boitiers
    intermédiaires sont souvent <link
    local="killed-by-proxy">programmés avec les pieds</link>, et
    ouvrent <link local="https-interception">de nombreuses
    failles</link>.) Le RFC rappelle notamment que l'intermédiaire qui
    termine une session 
    doit suivre le RFC à la lettre (ce qui devrait aller sans dire…)</p>
  <p>Depuis le <rfc num="4346"/>, il existe plusieurs registres <wikipedia name="Internet Assigned Numbers Authority">IANA</wikipedia> pour
    TLS, décrits en section 11, avec leurs nouveautés. En effet,
    plusieurs choix pour TLS ne sont pas « câblés en dur » dans le RFC
    mais peuvent évoluer indépendamment. Par exemple, le
    <link url="https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-4">registre de suites cryptographiques</link> a
    une politique d'enregistrement « spécification nécessaire » (cf. <rfc
    num="8126" local="true"/>, sur les politiques
    d'enregistrement). La <wikipedia>cryptographie</wikipedia> fait
    régulièrement des progrès, et il faut donc pouvoir modifier la
    liste des suites acceptées (par exemple lorsqu'il faudra y ajouter
    les <link local="pas-sage-en-seine-quantique">algorithmes
    post-quantiques</link>) sans avoir à toucher au RFC (l'annexe B.4
    donne la liste <emphasis>actuelle</emphasis>). Le registre <link url="https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-5">des types de
    contenu</link>, lui, a une politique d'enregistrement bien plus
    stricte, « action de normalisation ». On crée moins souvent des
    types que des suites cryptographiques. Même chose pour le <link
    url="https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-6">registre des alertes</link> ou pour <link
    url="https://www.iana.org/assignments/tls-parameters/tls-parameters.xml#tls-parameters-7">celui des salutations</link>.<!-- Deux registres
    sont complètement nouveaux, mais très pointus. --></p>
  <p>L'annexe C du RFC plaira aux programmeurs, elle donne plusieurs
  conseils pour une mise en œuvre correcte de TLS 1.3 (ce n'est pas
  tout d'avoir un protocole correct, il faut encore qu'il soit
  programmé correctement). Pour aider les développeurs à déterminer
  s'ils ont correctement fait le travail, le <rfc num="8448"/> fournit des
  <wikipedia xml:lang="en" name="Test vector">vecteurs de
  test</wikipedia>.</p>
  <p>Un des conseils les plus importants est évidemment de faire
  attention au <wikipedia name="Générateur de nombres
  aléatoires">générateur de nombres aléatoires</wikipedia>, source de
  tant de failles de sécurité en cryptographie. TLS utilise des
  nombres qui doivent être imprévisibles à un attaquant pour générer
  des clés de session. Si ces nombres sont prévisibles, toute la
  cryptographie s'effondre. Le RFC conseille fortement d'utiliser un
  générateur existant (comme <computer>/dev/urandom</computer> sur les
  systèmes <wikipedia>Unix</wikipedia>) plutôt que d'écrire le sien,
  ce qui est bien plus difficile qu'il ne semble. (Si on tient quand
  même à le faire, le <rfc num="4086" local="true"/> est une lecture
  indispensable.)</p>
  <p>Le RFC conseille également de vérifier le certificat du
  partenaire par défaut (quitte à fournir un moyen de débrayer cette
  vérification). Si ce n'est pas le cas, beaucoup d'utilisateurs du
  programme ou de la <wikipedia name="Bibliothèque
  logicielle">bibliothèque</wikipedia> oublieront de le faire. Il
  suggère aussi de ne pas accepter certains certificats trop faibles
  (clé <wikipedia name="Rivest Shamir Adleman">RSA</wikipedia> de
  seulement 1 024 bits, par exemple).</p>
  <p>Il existe plusieurs moyens avec TLS de ne pas avoir
    d'authentification du serveur : les clés brutes du <rfc num="7250"
    local="true"/> (à la place des certificats), ou bien les
    certificats auto-signés. Dans ces conditions, une
    <wikipedia name="Attaque de l'homme du milieu">attaque de l'homme du milieu</wikipedia> est
    parfaitement possible, et il faut donc prendre des précautions
    supplémentaires (par exemple <wikipedia name="DNS - based Authentication of Named Entities">DANE</wikipedia>,
    normalisé dans le <rfc num="6698" local="true"/>, que le RFC
    oublie malheureusement de citer).</p>
  <p>Autre bon conseil de cryptographie, se méfier des <wikipedia
    name="Attaque temporelle">attaques
    fondées sur la mesure du temps de calcul</wikipedia>, et prendre
    des mesures appropriées (par exemple en vérifiant que le temps de
    calcul est le même pour des données correctes et incorrectes).</p>
  <p>Il n'y a aucune bonne raison d'utiliser certains algorithmes
  faibles (comme <wikipedia>RC4</wikipedia>, abandonné depuis le <rfc
  num="7465" local="true"/>), et le RFC demande que le code pour ces
  algorithmes ne soit pas présent, afin d'éviter une <wikipedia
  xml:lang="en" name="Downgrade attack">attaque par repli</wikipedia>
  (annexes C.3 et D.5 du RFC). De la même façon, il demande de ne
  jamais accepter <wikipedia name="Transport Layer
  Security">SSL</wikipedia> v3 (<rfc num="7568" local="true"/>).</p>
  <p>L'expérience a prouvé que beaucoup de mises en œuvre de TLS ne
  réagissaient pas correctement à des options inattendues, et le RFC
  rappelle donc qu'il faut ignorer les suites cryptographiques
  inconnues (autrement, on ne pourrait jamais introduire une nouvelle
  suite, puisqu'elle casserait les programmes), et ignorer les
  extensions inconnues (pour la même raison).</p>
  <p>L'annexe D, elle, est consacrée au problème de la communication
  avec un vieux partenaire, qui ne connait pas TLS 1.3. Le mécanisme
  de négociation de la version du protocole à utiliser a complètement
  changé en 1.3. Dans la 1.3, le champ <computer>version</computer> du
  <computer>ClientHello</computer> contient 1.2, la vraie version
  étant dans l'extension <computer>supported_versions</computer>. Si
  un client 1.3 parle avec un serveur &lt;= 1.2, le serveur ne
  connaitra pas cette extension et répondra sans l'extension,
  avertissant ainsi le client qu'il faudra parler en 1.2 (ou plus
  vieux). Ça, c'est si le serveur est correct. S'il ne l'est pas ou,
  plus vraisemblablement, s'il est derrière une <foreign><wikipedia
  xml:lang="en" name="Middlebox">middlebox</wikipedia></foreign>
  boguée, on verra des problèmes comme par exemple le refus de
  répondre aux clients utilisant des extensions inconnues (ce qui sera
  le cas pour <computer>supported_versions</computer>), soit en
  rejettant ouvertement la demande soit, encore pire, en
  l'ignorant. Arriver à gérer des
  serveurs/<foreign>middleboxes</foreign> incorrects est un problème
  complexe. Le client peut être tenté de re-essayer avec d'autres
  options (par exemple tenter du 1.2, sans l'extension
  <computer>supported_versions</computer>). Cette méthode n'est pas
  conseillée. Non seulement elle peut prendre du temps (attendre
  l'expiration du délai de garde, re-essayer…) mais surtout, elle
  ouvre la voie à des <wikipedia xml:lang="en" name="Downgrade
  attack">attaques par repli</wikipedia> : l'attaquant bloque les
  <computer>ClientHello</computer> 1.3 et le client, croyant bien
  faire, se replie sur une version plus ancienne et sans doute moins
  sûre de TLS.</p>
  <p>En parlant de compatibilité, le « 0-RTT » n'est évidemment pas
    compatible avec les vieilles versions. Le client qui envoie du
    « 0-RTT » (des données dans le <computer>ClientHello</computer>)
    doit donc savoir que, si la réponse est d'un serveur &lt;= 1.2,
    la session ne pourra pas être établie, et il faudra donc réessayer
    sans 0-RTT.</p>
  <p>Naturellement, les plus gros problèmes ne surviennent pas avec
  les clients et les serveurs mais avec les
  <foreign>middleboxes</foreign>. Plusieurs études ont montré leur
  caractère néfaste (cf. <link
  url="https://datatracker.ietf.org/meeting/100/materials/slides-100-tls-sessa-tls13/">présentation
  à l'IETF 100</link>, <link
  url="https://www.ietf.org/mail-archive/web/tls/current/msg25168.html">mesures
  avec Chrome</link> (qui indique également que certains serveurs TLS
  sont gravement en tort, comme celui installé dans les imprimantes
  Canon), <link
  url="https://www.ietf.org/mail-archive/web/tls/current/msg25091.html">mesures
  avec Firefox</link>, et <link
  url="https://www.ietf.org/mail-archive/web/tls/current/msg25179.html">encore
  d'autres mesures</link>). Le RFC suggère qu'on limite les risques en
  essayant d'imiter le plus possible une salutation de TLS 1.2, par
  exemple en envoyant des messages
  <computer>change_cipher_spec</computer>, qui ne sont plus utilisés
  en TLS 1.3, mais qui peuvent rassurer la
  <foreign>middlebox</foreign> (annexe D.4).</p>
  <p>Enfin, le RFC se termine par l'annexe E, qui énumère les
  propriétés de sécurité de TLS 1.3 : même face à un attaquant actif
  (<rfc num="3552" local="true"/>), le protocole de salutation de TLS
  garantit des clés de session communes et secrètes, une
  authentification du serveur (et du client si on veut), et une
  <wikipedia name="Confidentialité persistante">sécurité
  persistante</wikipedia>, même en cas de compromission ultérieure des
  clés (sauf en cas de 0-RTT, un autre des inconvénients sérieux de ce
  service, avec le risque de rejeu). De nombreuses analyses détaillées
  de la sécurité de TLS sont listées dans l'annexe E.1.6. À lire si
  vous voulez travailler ce sujet.</p> <p>Quant au protocole des
  enregistrements, celui de TLS 1.3 garantit confidentialité et
  intégrité (<rfc num="5116"/>).</p> <p>TLS 1.3 a fait l'objet de
  nombreuses analyses de sécurité par des chercheurs<!-- Conférences
  TRON (TLS Ready or Not) -->, avant même sa normalisation, ce qui est
  une bonne chose (et qui explique en partie les retards). Notre
  annexe E pointe également les limites restantes de TLS :
    <enum>
      <item>Il est vulnérable à l'<wikipedia name="Attaque par analyse du trafic">analyse de
      trafic</wikipedia>. TLS n'essaie pas de cacher la taille des
      paquets, ni l'intervalle de temps entre eux. Ainsi, si un client
      accède en HTTPS à un site Web servant quelques dizaines de pages
      aux tailles bien différentes, il est facile de savoir quelle
      page a été demandée, juste en observant les tailles. (Voir
      « <foreign><link url="https://arxiv.org/abs/1403.0297">I Know Why You Went to the Clinic:
      Risks and Realization of HTTPS Traffic
      Analysis</link></foreign> », de Miller, B., Huang, L., Joseph,
      A., et J. Tygar et « <foreign><link url="https://is.muni.cz/repo/1299983/https_client_identification-paper.pdf">HTTPS traffic
      analysis and client identification using passive SSL/TLS
      fingerprinting</link></foreign><!-- https://link.springer.com/article/10.1186/s13635-016-0030-7 https://is.muni.cz/repo/1321931?lang=en --> », de Husak, M., &#268;ermak,
      M., Jirsik, T., et P.  &#268;eleda). TLS fournit un mécanisme de
      remplissage avec des données bidon, permettant aux applications
      de brouiller les pistes. Certaines applications utilisant TLS
      ont également leur propre remplissage (par exemple, pour le
      <wikipedia name="Domain Name System">DNS</wikipedia>, c'est le <rfc num="7830"
      local="true"/>). De même, une mise en œuvre de TLS peut retarder
      les paquets pour rendre l'analyse des intervalles plus
      difficile. On voit que dans les deux cas, taille des paquets et
      intervalle entre eux, résoudre le problème fait perdre en
      performance (c'est pour cela que ce n'est pas intégré par défaut).</item>
      <item>TLS peut être également vulnérable à des attaques par
      <wikipedia name="Attaque par canal auxiliaire">canal auxiliaire</wikipedia>. Par exemple, la durée des
      opérations cryptographiques peut être observée, ce qui peut
      donner des informations sur les clés. TLS fournit quand même
      quelques défenses : l'<wikipedia name="Chiffrement authentifié">AEAD</wikipedia> facilite la
      mise en œuvre de calculs en temps constant, et format uniforme
      pour toutes les erreurs, empêchant un attaquant de trouver
      quelle erreur a été déclenchée.</item>
    </enum></p>
  <p>Le 0-RTT introduit un nouveau risque, celui de <wikipedia
  name="Attaque par rejeu">rejeu</wikipedia>. (Et 0-RTT a sérieusement
  contribué aux délais qu'à connu le projet TLS 1.3, plusieurs
  participants à l'<wikipedia name="Internet Engineering Task
  Force">IETF</wikipedia> <link
  url="http://bristolcrypto.blogspot.com/2017/03/pkc-2017-kenny-paterson-accepting-bets.html">protestant
  contre cette introduction risquée</link>.) Si l'application est
  <wikipedia name="Idempotence">idempotente</wikipedia>, ce n'est pas
  très grave. Si, par contre, les effets d'une requête précédentes
  peuvent être rejoués, c'est plus embêtant (imaginez un transfert
  d'argent répété…) TLS ne promet rien en ce domaine, c'est à chaque
  serveur de se défendre contre le rejeu (la section 8 donne des idées
  à ce sujet). Voilà pourquoi le RFC demande que les requêtes 0-RTT ne
  soient pas activées par défaut, mais uniquement quand l'application
  au-dessus de TLS le demande. (<wikipedia>Cloudflare</wikipedia>, par
  exemple, n'active pas le 0-RTT<!--
  https://blog.cloudflare.com/you-get-tls-1-3-you-get-tls-1-3-everyone-gets-tls-1-3/
  --> par défaut.)</p>
  <p>Voilà, vous avez maintenant fait un tour complet du RFC, mais
     vous savez que la cryptographie est une chose difficile, et pas
     seulement dans les algorithmes cryptographiques (TLS n'en invente
     aucun, il réutilise des algorithmes existants comme
     <wikipedia name="Advanced Encryption Standard">AES</wikipedia> ou <wikipedia name="Elliptic curve digital signature algorithm">ECDSA</wikipedia>), mais
     aussi dans les protocoles cryptographiques, un art
     complexe. N'hésitez donc pas à lire le RFC en détail, et à vous
     méfier des résumés forcément toujours sommaires, comme cet
     article.</p>
  <p>À part le 0-RTT, le plus gros débat lors de la création de TLS
  1.3 avait été autour du concept que ses partisans nomment
  « visibilité » et ses adversaires « surveillance ». C'est l'idée
  qu'il serait bien pratique si on (on : le patron, la police, le
  <wikipedia name="Fournisseur d'accès à Internet">FAI</wikipedia>…)
  pouvait accéder au contenu des communications TLS. « Le chiffrement,
  c'est bien, à condition que je puisse lire les données quand même »
  est l'avis des partisans de la visibilité. Cela avait été proposé
  dans les <foreign><wikipedia xml:lang="en" name="Internet
  Draft">Internet-Drafts</wikipedia></foreign> <computer><link
  url="https://datatracker.ietf.org/doc/draft-green-tls-static-dh-in-tls13/">draft-green-tls-static-dh-in-tls13</link></computer>
  et <computer><link
  url="https://datatracker.ietf.org/doc/draft-rhrd-tls-tls13-visibility/">draft-rhrd-tls-tls13-visibility</link></computer>. Je
  ne vais pas ici pouvoir capturer la totalité du débat, juste noter
  quelques points qui sont parfois oubliés dans la discussion. Côté
  partisans de la visibilité :
     <enum>
       <item>Dans une entreprise capitaliste, il n'y pas de citoyens,
       juste un patron et des employés. Les ordinateurs appartiennent
       au patron, et les employés n'ont pas leur mot à dire. Le patron
       peut donc décider d'accéder au contenu des communications chiffrées.</item>
       <item>Il existe des règles (par exemple
       <wikipedia name="Norme de sécurité de l’industrie des cartes de paiement">PCI-DSS</wikipedia> dans le secteur financier ou
       <wikipedia name="Health Insurance Portability and Accountability Act">HIPAA</wikipedia> dans celui de la santé) qui requièrent de certaines
       entreprises qu'elles sachent en détail tout ce qui circule sur
       le réseau. Le moyen le plus simple de le faire est de
       surveiller le contenu des communications, même
       chiffrées. (Je ne dis pas que ces règles sont intelligentes,
       juste qu'elles existent. Notons par exemple que les mêmes
       règles imposent d'utiliser du chiffrement fort, sans faille
       connue, ce qui est contradictoire.)</item>
       <item>Enregistrer le trafic depuis les <link
       local="terminal-host">terminaux</link> est compliqué en
       pratique : applications qui n'ont pas de mécanisme de
       journalisation du trafic, systèmes d'exploitation fermés,
       boîtes noires…</item>
       <item>TLS 1.3 risque de ne pas être déployé dans les
       entreprises qui tiennent à surveiller le trafic, et pourrait
       même être interdit dans certains pays, où la surveillance passe
       avant les droits humains.</item>
  </enum>
  Et du côté des adversaires de la surveillance :
  <enum>
	 <item>La cryptographie, c'est compliqué et risqué. TLS 1.3
	 est déjà assez compliqué comme cela. Lui ajouter des
	 fonctions (surtout des fonctions délibérement conçues pour
	 affaiblir ses propriétés de sécurité) risque fort d'ajouter
	 des failles de sécurité. D'autant plus que TLS 1.3 a fait
	 l'objet de nombreuses analyses de sécurité avant son
	 déploiement, et qu'il faudrait tout recommencer.</item>
	 <item>Contrairement à ce que semblent croire les partisans de
	 la « visibilité », il n'y a pas que
	 <wikipedia name="HyperText Transfer Protocol Secure">HTTPS</wikipedia> qui utilise TLS. Ils ne
	 décrivent jamais comment leur proposition marcherait avec des
	 protocoles autres que HTTPS.</item>
	 <item>Pour HTTPS, et pour certains autres protocoles, une
	 solution simple, si on tient absolument à intercepter tout le
	 trafic, est d'avoir un <wikipedia
	 name="Proxy">relais</wikipedia> explicite, configuré dans les
	 applications, et combiné avec un blocage dans le
	 <wikipedia name="Pare-feu (informatique)">pare-feu</wikipedia> des connexions TLS
	 directes. Les partisans de la visibilité ne sont en général
	 pas enthousiastes pour cette solution car ils voudraient
	 faire de la surveillance furtive, sans qu'elle se voit dans
	 les applications utilisées par les employés ou les citoyens.</item>
	 <item>Les partisans de la « visibilité » disent en général
	 que l'interception TLS serait uniquement à l'intérieur de
	 l'entreprise, pas pour l'Internet public. Mais, dans ce cas,
	 tous les  <link
         local="terminal-host">terminaux</link> sont propriété de
	 l'entreprise et contrôlés par elle, donc elle peut les
	 configurer pour copier tous les messages échangés. Et, si
	 certains de ces terminaux sont des boîtes noires, non
	 configurables et dont on ne sait pas bien ce qu'ils font,
	 eh bien, dans ce cas, on se demande pourquoi des gens qui
	 insistent sur leurs obligations de surveillance mettent sur
	 leur réseau des machines aussi incontrôlables.</item>
	 <item>Dans ce dernier cas (surveillance uniquement au sein
	 d'une entreprise), le problème est interne à l'entreprise, et
	 ce n'est donc pas à 
	 l'<wikipedia name="Internet Engineering Task Force">IETF</wikipedia>, organisme qui fait des
	 <wikipedia name="Norme et standard techniques">normes</wikipedia> pour
	 l'<wikipedia>Internet</wikipedia>, de le résoudre. Après
	 tout, rien n'empêche ces entreprises de garder TLS 1.2.</item>
       </enum>
   </p>
  <p>Revenons maintenant aux choses sérieuses, avec les mises en œuvre
  de TLS 1.3. Il y en existe au moins une dizaine à l'heure actuelle
  et la version 1.3 est désormais largement déployée.</p>
  <p>Par exemple, avec un <wikipedia>GnuTLS</wikipedia> <link
   url="https://nikmav.blogspot.com/2018/05/gnutls-and-tls-13.html">récent</link>, on peut utiliser le
   programme en ligne de commande <computer>gnutls-cli</computer> avec
   un serveur qui accepte TLS 1.3 :
<code>
% gnutls-cli -V gmail.com 
...
- Description: (TLS1.3-X.509)-(ECDHE-SECP256R1)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM)
- Ephemeral EC Diffie-Hellman parameters
  - Using curve: SECP256R1
  - Curve size: 256 bits
- Version: TLS1.3
- Server Signature: ECDSA-SECP256R1-SHA256
- Cipher: AES-256-GCM
- MAC: AEAD
...
</code>
  Et ça marche, on fait du TLS 1.3. Si vous préférez écrire le
  programme vous-même, regardez <file name="test-tls13.c">ce petit
  programme</file>. Si GnuTLS est en <computer>/local</computer>, il
  se compilera avec <computer>cc -I/local/include -Wall -Wextra -o
  test-tls13 test-tls13.c -L/local/lib -lgnutls</computer> et
  s'utilisera avec :
<code>
% ./test-tls13 www.ietf.org      
TLS connection using "TLS1.3 AES-256-GCM"

%  ./test-tls13 gmail.com  
TLS connection using "TLS1.3 AES-256-GCM"

% ./test-tls13 blog.cloudflare.com
TLS connection using "TLS1.3 AES-256-GCM"

% ./test-tls13  cr.yp.to     
TLS connection using "TLS1.2 CHACHA20-POLY1305"
  </code>
  Cela vous donne une petite idée des serveurs qui acceptent TLS
  1.3 (le dernier testé ne l'accepte pas).
</p>
  <p>Un <wikipedia>pcap</wikipedia> d'une session TLS 1.3 est
  disponible en <file name="tls13-2.pcap"/>. Regardez le numéro de
  version de TLS dans l'extension (0x304), qui identifie TLS 1.3. Voici la
  session vue par <wikipedia name="Wireshark">tshark</wikipedia> :
<code>
    1   0.000000 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 94 56462 → 443 [SYN] Seq=0 Win=64800 Len=0 MSS=1440 SACK_PERM TSval=2022119812 TSecr=0 WS=1024
    2   0.005516 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 94 443 → 56462 [SYN, ACK] Seq=0 Ack=1 Win=65535 Len=0 MSS=1360 SACK_PERM TSval=4271324975 TSecr=2022119812 WS=8192
    3   0.005539 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 86 56462 → 443 [ACK] Seq=1 Ack=1 Win=65536 Len=0 TSval=2022119818 TSecr=4271324975
    4   0.005837 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TLSv1 492 Client Hello (SNI=www.cloudflare.com)
    5   0.011387 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 86 443 → 56462 [ACK] Seq=1 Ack=407 Win=131072 Len=0 TSval=4271324981 TSecr=2022119818
    6   0.013523 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TLSv1.3 1434 Server Hello, Change Cipher Spec
    7   0.013523 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 520 [TCP Previous segment not captured] 443 → 56462 [PSH, ACK] Seq=2697 Ack=407 Win=131072 Len=434 TSval=4271324983 TSecr=2022119818 [TCP segment of a reassembled PDU]
    8   0.013523 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 1434 [TCP Out-Of-Order] 443 → 56462 [ACK] Seq=1349 Ack=407 Win=131072 Len=1348 TSval=4271324983 TSecr=2022119818
    9   0.013543 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 86 56462 → 443 [ACK] Seq=407 Ack=1349 Win=68608 Len=0 TSval=2022119826 TSecr=4271324983
   10   0.013555 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 98 [TCP Dup ACK 9#1] 56462 → 443 [ACK] Seq=407 Ack=1349 Win=68608 Len=0 TSval=2022119826 TSecr=4271324983 SLE=2697 SRE=3131
   11   0.013560 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 86 56462 → 443 [ACK] Seq=407 Ack=3131 Win=68608 Len=0 TSval=2022119826 TSecr=4271324983
   12   0.013799 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TLSv1.3 92 Change Cipher Spec
   13   0.028771 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TLSv1.3 160 Application Data
   14   0.034250 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 86 443 → 56462 [ACK] Seq=3131 Ack=488 Win=131072 Len=0 TSval=4271325004 TSecr=2022119826
   15   0.035800 2606:4700::6810:7b60 → 2001:41d0:302:2200::180 TCP 86 443 → 56462 [FIN, ACK] Seq=3131 Ack=488 Win=131072 Len=0 TSval=4271325005 TSecr=2022119826
   16   0.035821 2001:41d0:302:2200::180 → 2606:4700::6810:7b60 TCP 86 56462 → 443 [ACK] Seq=488 Ack=3132 Win=69632 Len=0 TSval=2022119848 TSecr=4271325005
</code>
  Et, complètement décodée par tshark :
<code>
<![CDATA[
Transport Layer Security
    TLSv1 Record Layer: Handshake Protocol: Client Hello
        Content Type: Handshake (22)
        Version: TLS 1.0 (0x0301)
        Length: 401
        Handshake Protocol: Client Hello
            Handshake Type: Client Hello (1)
            Length: 397
            Version: TLS 1.2 (0x0303)
            Cipher Suites Length: 58
            Cipher Suites (29 suites)
                Cipher Suite: TLS_AES_256_GCM_SHA384 (0x1302)
                Cipher Suite: TLS_CHACHA20_POLY1305_SHA256 (0x1303)
                …
            Compression Methods Length: 1
            Compression Methods (1 method)
                Compression Method: null (0)
            Extensions Length: 266
            Extension: ec_point_formats (len=2)
                Type: ec_point_formats (11)
                Length: 2
                EC point formats Length: 1
                Elliptic curves point formats (1)
                    EC point format: uncompressed (0)
            Extension: key_share (len=107) secp256r1, x25519
                Type: key_share (51)
                Length: 107
                Key Share extension
                    Client Key Share Length: 105
                    Key Share Entry: Group: secp256r1, Key Exchange length: 65
                        Group: secp256r1 (23)
                        Key Exchange Length: 65
                        Key Exchange: 04baaae9e5261e75a052917c5266e92491905e012c8403dacdb3ae5cd4edc025d87d6d1131fb01e1c71d031cd5c1e4eaa49a8db64dceea2238a2f459206f5e592a
                    Key Share Entry: Group: x25519, Key Exchange length: 32
                        Group: x25519 (29)
                        Key Exchange Length: 32
                        Key Exchange: 81f6e52c0e771d320529cdff1729c1c290842a68044f86223a80cf608926be5d
            Extension: server_name (len=23) name=www.cloudflare.com
                Type: server_name (0)
                Length: 23
                Server Name Indication extension
                    Server Name list length: 21
                    Server Name Type: host_name (0)
                    Server Name length: 18
                    Server Name: www.cloudflare.com
            Extension: status_request (len=5)
                Type: status_request (5)
                Length: 5
                Certificate Status Type: OCSP (1)
                Responder ID list Length: 0
                Request Extensions Length: 0
            Extension: session_ticket (len=0)
                Type: session_ticket (35)
                Length: 0
                Session Ticket: <MISSING>
            Extension: supported_groups (len=22)
                Type: supported_groups (10)
                Length: 22
                Supported Groups List Length: 20
                Supported Groups (10 groups)
                    Supported Group: secp256r1 (0x0017)
                    Supported Group: secp384r1 (0x0018)
                    Supported Group: secp521r1 (0x0019)
                    Supported Group: x25519 (0x001d)
                    Supported Group: x448 (0x001e)
                    Supported Group: ffdhe2048 (0x0100)
                    Supported Group: ffdhe3072 (0x0101)
                    Supported Group: ffdhe4096 (0x0102)
                    Supported Group: ffdhe6144 (0x0103)
                    Supported Group: ffdhe8192 (0x0104)
            Extension: record_size_limit (len=2)
                Type: record_size_limit (28)
                Length: 2
                Record Size Limit: 16385
            Extension: encrypt_then_mac (len=0)
                Type: encrypt_then_mac (22)
                Length: 0
            Extension: supported_versions (len=9) TLS 1.3, TLS 1.2, TLS 1.1, TLS 1.0
                Type: supported_versions (43)
                Length: 9
                Supported Versions length: 8
                Supported Version: TLS 1.3 (0x0304)
                Supported Version: TLS 1.2 (0x0303)
                Supported Version: TLS 1.1 (0x0302)
                Supported Version: TLS 1.0 (0x0301)
            Extension: psk_key_exchange_modes (len=3)
                Type: psk_key_exchange_modes (45)
                Length: 3
                PSK Key Exchange Modes Length: 2
                PSK Key Exchange Mode: PSK with (EC)DHE key establishment (psk_dhe_ke) (1)
                PSK Key Exchange Mode: PSK-only key establishment (psk_ke) (0)
            Extension: extended_master_secret (len=0)
                Type: extended_master_secret (23)
                Length: 0
            Extension: signature_algorithms (len=40)
                Type: signature_algorithms (13)
                Length: 40
                Signature Hash Algorithms Length: 38
                Signature Hash Algorithms (19 algorithms)
                    Signature Algorithm: Unknown SM2 (0x0904)
                        Signature Hash Algorithm Hash: Unknown (9)
                        Signature Hash Algorithm Signature: SM2 (4)
                    Signature Algorithm: Unknown Unknown (0x0905)
                        Signature Hash Algorithm Hash: Unknown (9)
                        Signature Hash Algorithm Signature: Unknown (5)
                 …
            Extension: renegotiation_info (len=1)
                Type: renegotiation_info (65281)
                Length: 1
                Renegotiation Info extension
                    Renegotiation info extension length: 0
]]>
</code>
  Le texte complet est en <file
		name="tls13-2.txt"/>. Notez bien que la négociation est
en clair. D'autres exemples de traces TLS 1.3 figurent dans le <rfc
num="8448"/>.</p>
  <p>
  Quelques autres articles à lire :
  <enum>
    <item>L'<link url="https://www.ietf.org/blog/tls13/">annonce
    officielle de l'IETF</link>,</item>
    <item>Le <link
    url="https://blog.cloudflare.com/rfc-8446-aka-tls-1-3/">bon
    résumé</link> de Cloudflare sur la version 1.3,</item>
    <item><link url="https://github.com/sftcd/tinfoil">Liste complète
    des réponses aux partisans de la visbilité</link>,</item>
    <item><link url="https://tlseminar.github.io/tls-13/">Bon article
    historique très détaillé sur l'histoire de TLS</link>, jusqu'à la
    version 1.3,</item>
   <item>Un exemple d'<link
   url="https://www.ietfjournal.org/tron-workshop-connects-ietf-tls-engineers-and-security-researchers/">un
   des ateliers où a été étudié la sécurité de TLS 1.3
   à San Diego en 2016</link>,</item>
   <item><link
	     url="https://blog.cloudflare.com/why-tls-1-3-isnt-in-browsers-yet/">Bon
   article sur la question des middleboxes</link>, expliquant
   notamment les extensions « inutiles », mais permettant de tromper
   ces <foreign>middleboxes</foreign> pour ressembler à TLS
   1.2.</item>
  </enum>
</p>
</content>
</rfcdesc>
