Poignées de main TLS (SSL) expliquées
Les poignées de main TLS (SSL) ne semblent peut-être pas très familières, mais elles constituent l'un des éléments les plus critiques d'une connexion sécurisée à un site Web. TLS signifie Transport Layer Security, tandis que SSL est l'abréviation de Secure Sockets Layer. Les gens utilisent souvent les termes de manière interchangeable, mais TLS n’est en réalité que la version mise à jour de SSL.
La prise de contact TLS est un élément essentiel du protocole TLS global. Il s’agit d’un sous-protocole chargé d’établir en toute sécurité les paramètres de la connexion. Une fois la connexion TLS établie, les données sont envoyées de manière sécurisée via la couche d'enregistrement, qui est l'autre sous-protocole principal de TLS.
La poignée de main TLS joue un rôle important dans une grande partie de votre sécurité en ligne. Il s’agit d’un élément clé de la mise en place de connexions sécurisées, depuis les appels VOIP jusqu’à votre page de connexion par courrier électronique.
Qu'est-ce que TLS (SSL) ?
Sécurité de la couche de transport (TLS) est un protocole qui peut assurer la sécurité sur des réseaux comme Internet. Si nous n’avions pas de protocoles de sécurité, nous serions confrontés à toute une série de problèmes, notamment lors du transport de données sensibles et importantes.
Sans protocoles de sécurité :
- Il n’y aurait aucun moyen de protéger les détails intimes que vous avez partagés dans vos messages privés.
- Vous ne saurez pas si vous vous trouvez réellement sur le site Internet de votre banque ou sur une copie frauduleuse.
- Vous ne pouviez pas empêcher vos messages d’être modifiés par des attaquants avant qu’ils ne soient remis à vos destinataires.
TLS est l'un des mécanismes développés pour résoudre ces problèmes, et il est capable de :
- Authentifiez les autres parties.
- Indiquez si les données conservent leur intégrité.
- Gardez les données confidentielles.
TLS fonctionne entre les couches réseau et application du Modèle OSI . La prise de contact TLS (SSL) est une couche du protocole TLS et son objectif est d'authentifier l'autre partie et d'établir des paramètres sécurisés pour l'échange de données. L'autre couche majeure est l'enregistrement TLS, qui utilise les paramètres définis lors de la poignée de main pour envoyer en toute sécurité les données entre les parties. Il transmet ces données dans des paquets appelés enregistrements.
Un bref aperçu de TLS (SSL)
TLS a commencé sa vie grâce à un initiative commune de plusieurs agences et entreprises du gouvernement américain dans les années 80. Il a évolué vers différentes versions de Secure Sockets Layer (SSL) dans les années 1990. En 1999, la version mise à jour du protocole a vu son nom changé pour Transport Security Layer, dans le cadre de ce qui était essentiellement un compromis entre Microsoft et Netscape. La dernière version est TLS 1.3, que les dernières versions de navigateurs comme Chrome et Firefox utilisent par défaut.
Les usages de TLS (SSL)
De nos jours, vos données transitent souvent via TLS chaque fois que vous êtes en ligne. TLS fournit la sécurité HTTPS, qui est utilisée par la plupart des principaux sites Web pour protéger vos données. C’est particulièrement courant sur les pages de connexion et dans les services bancaires en ligne. Vous pouvez savoir quand un site Web est sécurisé par TLS, car l'URL commencera par https plutôt que http , et il y aura une petite icône de cadenas à gauche de la barre d'adresse.
TLS peut également être implémenté sur un certain nombre d'autres protocoles de couche transport pour assurer la sécurité. Ceux-ci incluent SMTP, FTP, XMPP et autres. Lorsque TLS est en place parallèlement à ces protocoles, il peut protéger respectivement les e-mails, les transferts de fichiers et la messagerie instantanée. TLS peut également être utilisé pour protéger les données transmises via les VPN.
Qu'est-ce qu'une poignée de main ?
Lorsque vous allez en ligne, vous ne réfléchissez probablement pas beaucoup à ce qui se passe sous le capot pour que tout se réalise. Vous vous souciez probablement beaucoup plus des mèmes ou des vidéos YouTube que des détails techniques complexes de la façon dont ils arrivent sur votre téléphone.
Même si cela peut être instantané, beaucoup de choses doivent se produire pour que votre appareil (le client) se connecte à un site Web comme Facebook, qui fait office de serveur. Notre écosystème d’informations est composé d’un énorme méli-mélo de normes, protocoles, procédures, chiffres et bien plus encore.
Le client (votre téléphone ou votre ordinateur) en prendra en charge plusieurs dans un ordre de préférence, alors qu'il ne sera pas compatible avec d'autres. Le serveur de Facebook fera de même, mais bon nombre de ses protocoles, normes, chiffrements et tout le reste peuvent être différents de ceux de votre téléphone ou de votre ordinateur. Certains clients et serveurs ne disposeront pas des dernières versions, tandis que d’autres refuseront de se connecter de manière non sécurisée.
Essentiellement, lorsque le client et le serveur se rencontrent, ils doivent trier ce désordre de systèmes différents pour trouver un moyen de communication acceptable et mutuellement intelligible. C'est à cela que sert la poignée de main. Il peut être utile de penser à la poignée de main à travers une analogie :
Voyageurs venus de pays lointains
Imaginez deux personnes venues de pays lointains communiquant pour la première fois. Ils viennent de cultures extrêmement différentes, avec leurs propres langues, coutumes, manières et bien plus encore. Cependant, les deux personnes ont extrêmement voyagé et ont découvert de nombreux systèmes différents des endroits qu'ils ont traversés.
Les deux personnes souhaitent faire des affaires ensemble et doivent donc pouvoir communiquer de manière claire et efficace. Mais comment y parvenir alors qu’ils ont le choix entre tant d’options différentes ? S’ils ne se mettent pas d’accord au préalable, ils risquent de confondre le « nein » allemand avec le chiffre « neuf ». Un coup de pouce amical occidental pourrait être interprété à tort comme un geste offensant de l’Iran.
Et s’ils voulaient garder leurs communications confidentielles ? Devraient-ils utiliser un simple chiffre de César, où chaque lettre est décalée d’une place vers la droite. A est égal à B, B est égal à C, C est égal à D, et ainsi de suite. Cela transformerait un mot comme « Bonjour » en « Ifmmp ». Ou devraient-ils utiliser un système comme Pig Latin, où « Bonjour » serait en réalité « ello-hay » ?
Comme vous pouvez le constater, ils ont le choix entre de nombreuses options, mais l’important est qu’ils soient tous deux d’accord sur les systèmes qu’ils utiliseront et sur la manière dont ils les utiliseront. Une bonne façon de prendre une décision consiste simplement à énumérer toutes les options qu’ils connaissent, par ordre de préférence.
Le voyageur A pourrait dresser une liste comme celle-ci :
- Alphabet
- romain
- arabe
- cyrillique
- Langue
- Anglais
- Espagnol
- arabe
- russe
- Gestes
- Occidental
- Sud-asiatique
- Chiffres
- Cochon latin
- Chiffre de César
- Unité de mesure
- Métrique
- Impérial
Le voyageur B pourrait alors parcourir la liste et choisir ses préférences parmi les options disponibles. Ils peuvent renvoyer un message avec leurs choix, par exemple :
- Alphabet – Romain
- Langue – espagnol
- Gestes – Asie du Sud
- Chiffre – Cochon Latin
- Unité de mesure – Métrique
Une fois que le voyageur A recevra le message du voyageur B, il saura exactement comment communiquer dans sa future correspondance. Ils pouvaient clairement discuter ou envoyer des lettres concernant leurs relations commerciales, sans se perdre. Les communications ne seraient pas cryptées avec un chiffre que l’autre partie ne pourrait pas déchiffrer, et ils ne se retrouveraient pas non plus avec 1 000 livres de blé alors qu’ils en voulaient vraiment 1 000 kg.
Handshaking : établissement des paramètres de communication
La scène que nous avons décrite ci-dessus est analogue à ce qui se passe lors d’une poignée de main plus technique. La seule différence majeure réside dans les types de paramètres utilisés dans les communications informatiques. Ceux-ci varient d’un protocole à l’autre, mais ils peuvent inclure des éléments tels que :
- Alphabet de codage
- Procédures d'interruption
- Chiffres
- Clés
- Compression
- Parité
- Taille du message
Certaines procédures de prise de contact peuvent être relativement simples, tandis que d'autres peuvent comprendre de nombreuses étapes et paramètres distincts qui doivent être décidés. L’important est qu’à la fin, les deux parties se retrouvent avec un moyen de communication convenu d’un commun accord, qu’elles pourront ensuite utiliser dans leurs interactions futures.
Versions TLS
En janvier 2021, 42,1 % des 150 000 sites Web les plus populaires du classement Alexa prenaient en charge TLS 1.3, selon Impulsion SSL . La même source indique que 99,2 % de ces sites Web prennent en charge la version précédente de TLS 1.2, tandis que 55,9 % prennent en charge TLS 1.1 et 49,4 % prennent en charge TLS 1.0. Seule une très petite fraction prend en charge l’une ou l’autre version de SSL.
Les dernières versions de la plupart des principaux navigateurs ont soit déjà désactivé leur prise en charge par défaut des versions 1.0 et 1.1 de TLS, soit elles le feront en 2021. Cela inclut Google Chrome , Microsoft Bord , Safari d'Apple et Mozilla Firefox . De nombreux autres logiciels populaires emboîtent également le pas.
TLS 1.3 sera au centre de notre article, car il s’agit de la version la plus récente et la plus sécurisée, et le monde s’y dirige lentement. Bien que les autres versions accomplissent à peu près la même tâche, il existe plusieurs différences clés qui les rendent moins efficaces et plus vulnérables aux attaques que TLS 1.3.
La poignée de main TLS (SSL) : la version courte
Le client se connecte au serveur et envoie un message Client Hello. Ce message inclut les paramètres qu'il prend en charge, tels que :
- Les versions de TLS avec lesquelles il est compatible.
- Une occasion.
- Les suites de chiffrement qu'il peut utiliser pour le cryptage et l'authentification.
- Un certain nombre d'extensions qui ajoutent des fonctionnalités. Cela inclut des éléments tels que les paramètres de partage des clés et un certain nombre d'extras.
En prévision du fait que le serveur acceptera bon nombre des mêmes paramètres que ceux préférés du client, le Client Hello inclut également des informations qui aident le serveur à établir une connexion sécurisée dans le cadre de sa réponse. Lorsque tel est le cas, il enregistre une série de messages. Cela rend TLS 1.3 plus rapide que les versions précédentes du protocole. Si le serveur ne peut pas répondre aux attentes du client, celui-ci devra renégocier.
Lorsque le serveur reçoit le message Client Hello, il envoie au client un message Server Hello en réponse. Cela inclut ses choix dans la liste de préférences du Client :
- La version de TLS.
- Une occasion.
- La suite de chiffrement.
- Ce sont des paramètres de partage clés.
Chacun des aspects ci-dessus est envoyé sous forme de texte brut, mais le Server Hello comprend également des messages supplémentaires qui ont été chiffrés avec des clés dérivées des aspects informatifs du message Server Hello. Ceux-ci inclus:
- Le certificat du serveur.
- Un message de vérification de certificat contenant une signature numérique du serveur.
- Un message Terminé, qui contient un HMAC que le client peut utiliser pour vérifier l'authenticité du message.
Une fois que le serveur envoie le message Terminé, il peut commencer à envoyer les données d'application au client. Ces données d'application sont cryptées avec un ensemble différent de matériel de chiffrement.
À moins que le client ne s'authentifie également auprès du serveur (auquel cas il doit envoyer son certificat et le message Certificate Verify), il lui suffit d'envoyer son message Terminé, qui est également crypté. Il peut alors commencer à envoyer des données d'application au serveur, bien que celles-ci soient cryptées avec un matériel de chiffrement différent. À ce stade, la négociation TLS est terminée.
La poignée de main TLS (SSL) en profondeur
Jetons un coup d'œil à ce à quoi ressemble une poignée de main TLS (SSL) typique. Lorsque vous visitez comparitech.com, votre navigateur agit en tant que client, qui se connecte au serveur, amenant finalement notre page Web sur votre écran. Sous TLS, lorsque le client souhaite se connecter au serveur, la première étape consiste pour le client à envoyer au serveur un message Client Hello.
Le Client Bonjour
Un message Client Hello ressemble à ceci dans WireShark :
Comme vous pouvez le constater, cela semble un peu compliqué. Nous nous contenterons de discuter des parties les plus importantes.
Version TLS
Dans la deuxième ligne, il est écrit Couche d'enregistrement TLSv1.3 : Protocole de prise de contact : Bonjour client . Cependant, si nous sautons quelques lignes, nous voyons Version : TLS 1.0 (0x0301) . Vous remarquerez peut-être également que quelques lignes plus bas, il est écrit Version : TLS 1.2 (0x0303) . Les numéros entre parenthèses derrière chaque version ne sont que des codes pour leurs versions respectives.
En regardant ces chiffres contradictoires, vous pourriez ne pas savoir quelle version de TLS le message Client Hello souhaite réellement utiliser. La réponse se trouve au plus profond du RFC , la documentation technique qui définit la norme TLS 1.3. Dans la section 4.2.1, il traite de l'extension des versions prises en charge (les extensions TLS peuvent ajouter des fonctionnalités et des capacités supplémentaires, mais elles ne sont pas obligatoires).
La RFC indique essentiellement que lorsque l'extension Supported Versions est présente, le serveur doit ignorer les autres versions mentionnées dans le message Client Hello et sélectionner à la place une version de l'extension.
Si nous ouvrons l'extension Supported Versions dans la cinquième ligne à partir du bas, nous voyons :
Ici, cela nous montre que seules les versions TLS 1.3 et 1.2 sont prises en charge. La version qui sera finalement utilisée dépendra de ce que le serveur prend en charge.
Longueur du message
En revenant vers le haut de la première image, nous voyons Longueur dans les cinquième et huitième lignes. Le premier indique 512, tandis que le second indique 508. Il s'agit simplement de la taille de leurs messages respectifs en octets, et la différence est due au fait que l'en-tête de l'enregistrement TLS lui-même occupe 4 octets.
aléatoire
Le champ en surbrillance dans la première capture indique aléatoire , et les données à côté sont un nom occasionnel de 32 octets. Il s’agit d’un nombre arbitraire qui n’est utilisé qu’une seule fois. Son objectif principal est d'arrêter rejouer les attaques . Essentiellement, l’ajout de ce numéro unique empêche un attaquant de pouvoir envoyer au client les mêmes paquets que ceux qu’il avait reçus lors d’une connexion précédente. Le nom occasionnel aléatoire est généré par un générateur de nombres aléatoires sécurisé.
ID de session Longueur et valeur
Après cela, nous avons deux champs distincts, Longueur de l'ID de session et ID de session . L'ID de session est un nombre de 32 octets et, dans les versions précédentes, il était utilisé pour reprendre les connexions lorsque le processus d'authentification avait déjà été terminé lors d'une connexion antérieure. Dans TLS1.3, l'extension de clé pré-partagée décrite ci-dessous est utilisée à la place.
Suites de chiffrement
Le Suites de chiffrement sont utilisés pour chiffrer et authentifier la connexion. En combinaison avec d’autres mécanismes cryptographiques de TLS, ces suites de chiffrement contribuent à garantir la confidentialité, l’authenticité et l’intégrité des données. Lorsque nous développons la section des suites de chiffrement, nous pouvons voir toutes les suites de chiffrement acceptées, répertoriées dans l'ordre de préférence du client :
Bien qu'il existe 18 suites différentes répertoriées, la RFC indique que TLS 1.3 ne prend en charge que cinq suites de chiffrement différentes :
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_CCM_SHA256
- TLS_AES_128_CCM_8_SHA256
Si vous regardez attentivement, vous verrez que les trois premiers des deux listes sont identiques, mais dans un ordre différent. Les deux derniers de la RFC ne sont pas pris en charge par le navigateur de notre exemple, c'est pourquoi ils ne sont pas inclus dans la capture Wireshark. La raison pour laquelle la capture montre 15 suites de chiffrement différentes est d'assurer une compatibilité descendante avec les anciennes versions de TLS.
Si seules les cinq suites de chiffrement TLS 1.3 étaient incluses, le navigateur ne pourrait pas se connecter de manière sécurisée aux navigateurs utilisant les versions TLS 1.2 ou antérieures. Étant donné que de nombreux serveurs n’utilisent toujours pas la dernière version, cela entraînerait d’importants problèmes de compatibilité.
Chaque suite de chiffrement est composée d'un chiffrement à clé symétrique et d'une paire de hachage HKDF. TLS 1.3 utilise uniquement cryptage authentifié avec données associées (AEAD) chiffrements comme ses chiffrements à clé symétrique. Ces algorithmes assurent à la fois l’intégrité, l’authenticité et la confidentialité des données.
HKDF sont des fonctions de dérivation de clé (KDF) basées sur des codes d'authentification de message basés sur le hachage (HMAC). TLS utilise HKDF pour extraire l'entropie et étendre les sorties générées dans le cadre du processus de dérivation de clé.
À titre d'exemple du fonctionnement des suites de chiffrement ci-dessus, TLS_AES_128_GCM_SHA256 utilise un mode de chiffrement AEAD de AES-128 GCM , avec le SHA-256 fonction de hachage comme le HKDF. Cette suite est plus puissante que la plupart des suites utilisées dans les versions précédentes de TLS.
Échange de clés
Un autre aspect essentiel pour établir une connexion sécurisée est l’échange de clés. Dans TLS 1.3, cela est réalisé grâce à des extensions. Soit l'extension Key Share, soit l'extension Pre-shared Key (cela n'a pas été utilisé dans l'exemple que nous examinons via Wireshark), ou les deux.
Le client et le serveur auront tous deux des paires de clés composées à la fois d'un clé publique et privée , qui sont mathématiquement liés. Lorsque ces paires de clés publique-privée sont utilisées parallèlement au Diffie Hellman à courbe elliptique protocole d'accord de clé, il permet au client et au serveur d'établir un secret partagé qu'ils peuvent utiliser pour chiffrer les communications futures. Grâce aux calculs complexes qui sous-tendent cet échange, les deux parties peuvent établir la clé en toute sécurité, même si un attaquant les écoute.
Dans notre capture Wireshark, à côté du premier Entrée de partage de clé : Groupe , on voit un code, x25519 , suivi de Durée d'échange de clé : 32 . Le code indique Courbe25519 , une courbe elliptique avec 128 bits de sécurité, utilisée dans le cadre du schéma d'accord de clé Diffie-Hellman à courbe elliptique. La longueur de l'échange de clé est exactement ce à quoi cela ressemble, la longueur de la clé dans l'échange.
En dessous, nous avons Échange de clés : efifecba2658 etc. C'est la clé que le client souhaite utiliser avec Curve22519, bien que la fin de celle-ci ait été coupée lors de la capture Wireshark.
En dessous, vous verrez Entrée de partage de clé : Groupe suivi du secp256r1 code. Cela fait référence aux normes pour une cryptographie efficace, tandis que le P signifie Paramètres. secp256r1 est simplement une autre courbe elliptique avec 256 bits de sécurité.
Curve25519 et secp256r1 sont les deux options fournies par le client pour l'échange de clés. Parce que x25519 vient en premier, Curve25519 est le choix préféré du client.
Lorsque l'extension Key Share est utilisée, le client envoie au serveur une ou plusieurs de ses clés publiques (mais pas leurs homologues privées) dans le cadre du message Client Hello. Dans ce cas, la clé pour Curve25519 et la clé pour la courbe secp256r1 ont été envoyées en prévision que le serveur prendra en charge au moins une de ces options. Si le serveur le fait, il peut commencer à chiffrer une partie de sa réponse lorsqu'il envoie le message Server Hello (nous en discuterons en détail plus loin dans l'article).
L’extension Key Share de TLS 1.3 constitue un écart significatif par rapport aux mécanismes utilisés dans la version 1.2 et à ceux qui l’ont précédée. Dans ces versions antérieures, un message Client Key Exchange supplémentaire était envoyé après le Client Hello. Cela signifiait qu’une plus grande partie de la poignée de main était envoyée sous forme de texte brut, la laissant visible aux attaquants.
En supposant que le serveur acceptera l'une des préférences du client et en éliminant le besoin du message Client Key Exchange, TLS 1.3 est également plus rapide et plus efficace que les versions précédentes.
Dans les cas où le serveur ne peut pas répondre aux attentes du client, le serveur envoie un Réessayez la demande Bonjour message pour tenter d'autres moyens d'établir une connexion sécurisée. Dans la plupart des cas, la présomption de TLS 1.3 finit par sauvegarder une série de messages, contribuant ainsi à accélérer l’échange. Globalement, cela s'avère plus efficace, même si les serveurs doivent parfois envoyer des messages RetryHelloRequest.
L’autre option majeure pour le partage de clés est l’extension Pre-Shared Key. Le client et le serveur ne peuvent l'utiliser que si une clé pré-partagée a déjà été établie. Cela peut être fait lors de connexions précédentes entre les deux parties ou via un mécanisme hors bande.
Lorsque le client et le serveur ont préalablement établi une clé pré-partagée, l'extension Pre-Shared Key permet au client de répertorier les options de clé pré-partagée disponibles pour le serveur. Dans notre capture Wireshark, les clés pré-partagées n'ont pas été utilisées, cette extension n'a donc eu aucun effet sur la connexion que nous observons.
Algorithmes de signature
TLS 1.3 contient deux extensions plus importantes qui déterminent lequel algorithmes de signature sera utilisé pour créer les signatures numériques qui assurent l’authentification et l’intégrité des données.
Les signatures numériques ressemblent beaucoup à votre signature manuscrite. Vous signez des reçus, des contrats et d’autres documents avec votre nom d’une manière difficile à falsifier. Cela vous donne un moyen simple et surtout fiable d’authentifier que c’est bien vous qui signez les informations. Votre signature implique que vous avez vérifié que les détails du document étaient corrects au moment de la signature, démontrant ainsi l'intégrité des données.
Les signatures numériques remplissent des rôles similaires, nous permettant de vérifier l'authenticité et l'intégrité des informations. La principale différence est qu’ils utilisent pour ce faire un mélange d’algorithmes à clé publique et de fonctions de hachage.
Le Extension des algorithmes de signature a été introduit dans TLS 1.2 et indique les types d'algorithmes de signature pris en charge par le client. Si le client souhaite que le serveur s'authentifie avec un certificat, le client doit envoyer l'extension Signature Algorithms dans le cadre de son message Client Hello.
Les algorithmes de signature répertoriés dans le message Client Hello peuvent influencer le type de certificat que le serveur enverra au client dans le cadre de son message Certificat (cela se produit plus tard, dans le cadre du Server Hello). Le serveur choisira également son algorithme de signature préféré dans la liste des clients, qui est utilisée dans le cadre du message Certificate Verify, qui est une autre partie du message Server Hello. Nous discuterons plus en détail des messages Certificate et Certificate Verify lorsque nous aborderons plus tard les détails du message Server Hello.
La deuxième extension est la Extension du certificat d'algorithmes de signature , qui a été ajouté dans TLS 1.3. Il permet aux implémentations de montrer clairement leurs capacités dans les situations où elles prennent en charge une liste d'algorithmes pour les certificats et un ensemble distinct pour TLS lui-même.
Si une implémentation utilise le même ensemble d’algorithmes pour les certificats et TLS lui-même, le certificat des algorithmes de signature peut être omis. Si l’extension Signature Algorithm Cert n’est pas présente dans un message, alors l’extension Signature Algorithm est appliquée à la fois aux signatures des certificats ainsi qu’à TLS lui-même.
Les algorithmes de signature acceptés de TLS 1.3 incluent les éléments suivants, par ordre de préférence :
- rsa_pkcs1_sha256(0x0401)
- rsa_pkcs1_sha384(0x0501)
- rsa_pkcs1_sha512(0x0601)
- ecdsa_secp256r1_sha256(0x0403)
- ecdsa_secp384r1_sha384(0x0503)
- ecdsa_secp521r1_sha512(0x0603)
- rsa_pss_rsae_sha256(0x0804)
- rsa_pss_rsae_sha384(0x0805)
- rsa_pss_rsae_sha512(0x0806)
- ed25519(0x0807)
- ed448(0x0808)
- rsa_pss_pss_sha256(0x0809)
- rsa_pss_pss_sha384(0x080a)
- rsa_pss_pss_sha512(0x080b)
Les algorithmes suivants sont également inclus à des fins héritées :
- rsa_pkcs1_sha1(0x0201)
- ecdsa_sha1(0x0203)
Pour illustrer la signification réelle de chacun de ces codes, prenons l’exemple suivant :
- rsa_pkcs1_sha256(0x0401)
Il comprend les lettres rsa , parce qu'il est basé sur le Cryptosystème RSA , opérant sous les propriétés définies dans le PKCS #1 famille de normes de cryptographie à clé publique. C'est pourquoi le pkcs1 vient ensuite. Sous cet algorithme de signature particulier, le message est haché avec la fonction de hachage SHA-256, ce qui explique le sha256 . Enfin, les crochets 0x0401 est simplement un code pour cet algorithme de signature particulier.
Méthodes de compression et autres extensions
Si vous avez suivi de près, vous avez peut-être remarqué que nous avons négligé d'aborder de nombreuses lignes dans notre capture Wireshark du message Client Hello. Ceci comprend Méthodes de compression et un tas d'extensions. Les méthodes de compression correspondent simplement au type de compression pris en charge par le client. La compression peut rendre la connexion vulnérable aux attaques par canal secondaire, c'est pourquoi TLS 1.3 définit toujours les méthodes de compression sur nul , ce qui empêche l'utilisation de la compression.
Bien que les autres extensions ajoutent des fonctionnalités supplémentaires et puissent être importantes, il n’est pas nécessaire de les étudier pour comprendre une poignée de main TLS de base.
Serveur Bonjour
Lorsque nous inspectons la réponse du serveur au message Client Hello dans Wireshark, nous voyons ce qui suit :
Dans la deuxième ligne, il nous indique qu’il s’agit du message Server Hello du Handshake Protocol.
Version TLS
Encore une fois, nous avons un conflit apparent au sujet des versions. Cette fois, il est indiqué TLS 1.2 tout au long de la capture, mais lorsque nous ouvrons le Extension des versions prises en charge vers le milieu du diagramme, on voit qu'il est écrit TLS1.3 (0x0304) :
Si vous vous souvenez de notre discussion sur les versions dans le message Client Hello, vous vous souviendrez que l'extension Supported Versions remplace les autres mentions de la version. Cela signifie que dans ce cas, le serveur prend également en charge TLS 1.3, et c'est ce qu'il a choisi pour la connexion.
Longueur du message
Quand on compare les Longueur champs sur les cinquième et huitième lignes, nous remarquons à nouveau l'écart de quatre octets, tout comme dans le message Client Hello. Encore une fois, il s'agit de la longueur de l'en-tête de l'enregistrement.
aléatoire
Le message Server Hello contient son propre nom occasionnel de 32 octets. Ce nombre aléatoire est utilisé pour empêcher les attaques par relecture. Ce nom occasionnel est également dérivé d'un générateur de nombres aléatoires sécurisé.
ID de session Longueur et valeur
Si vous comparez la capture Wireshark du message Client Hello avec le message Server Hello, vous pouvez voir que l'ID de session est le même numéro :
d39dc9ddf6ff41f558a35719cbe93be6ef9cffdd339e84ec…
TLS 1.3 n'utilise plus l'ID de session pour rétablir les connexions, car il peut désormais utiliser l'extension Pre-Shared Key à la place. L'ID de session est conservé dans TLS 1.3 pour des raisons héritées, et il s'agit simplement d'une copie de l'ID de session envoyée par le client.
Suite de chiffrement
Si vous regardez le Suite de chiffrement , vous pouvez voir qu’il n’est plus extensible. En effet, le message Server Hello ne contient pas de liste de ses suites préférées comme le fait le message Client Hello. Au lieu de cela, il présente la suite de chiffrement qu'il a choisie dans la liste proposée par le client. Dans ce cas, c'est :
TLS_AES_128_GCM_SHA256 (0x1301)
Il s’agit également de la suite de chiffrement préférée du client. Reportez-vous à la section Cipher Suite du Client Hello si vous avez besoin d'un rappel des algorithmes représentés par ce méli-mélo de caractères.
Extension de partage de clé
Le serveur aura ses propres paires de clés, composées à la fois d'une clé publique et d'une clé privée, tout comme le client. Les clés du serveur sont tout aussi importantes pour établir un secret partagé pouvant être utilisé pour sécuriser la connexion.
Dans le cadre de l'extension Key Share, le serveur examinera les options d'échange de clés envoyées dans le message Client Hello, puis fera son choix :
Dans ce cas, il s’agit de Curve25519, indiqué par le x25519. Le serveur envoie également une clé publique à partir de sa paire de clés. Une partie de cette clé publique est affichée après Échange de clés :
ad904668c…
Modifier le protocole de spécification de chiffrement : Modifier la spécification de chiffrement
Juste en dessous de l'extension Key Share, vous verrez quelque chose qui n'a pas été référencé dans le message Client Hello, le Modifier le protocole de spécification de chiffrement : Modifier la spécification de chiffrement champ. Il est inclus dans Server Hello pour la compatibilité avec les anciennes versions. Bien qu’il mentionne TLS 1.2, il ne s’applique pas à cet égard.
Protocole de données d'application
Les autres parties importantes du message Server Hello se déroulent dans les champs Application Data Protocol au bas de la capture Wireshark. Cependant, ils ont été cryptés par le serveur, ce qui signifie que nous ne pouvons pas réellement voir ce qui se passe avec Wireshark :
Les données cryptées sont un fouillis de chiffres et de lettres qui suivent le Données d'application cryptées des champs.
Les données chiffrées incluent les autres extensions, le message de certificat, le message de vérification du certificat et le message terminé. Bien que nous ne puissions pas voir ce qui se passe dans Wireshark, nous pouvons consulter la RFC pour comprendre ce qui se passe en dessous. Avant de discuter de ces données chiffrées, expliquons comment les clés qui chiffrent les données sont générées.
Génération de clé
A cette étape de la connexion, le serveur dispose déjà de toutes les informations nécessaires au calcul des clés pour cette étape de l'échange. Ceci comprend:
- La clé publique du client, qu'il a reçue dans le message Client Hello. Inventons simplement un nombre aléatoire, pour vous donner une idée de ce à quoi cela ressemblerait :
2abaead2e3f909196283942b969c89b9cfb9c994c39fa0a1a253445a6a7afa9
- La clé privée du serveur, qu’il n’a partagée avec personne. Le serveur envoie sa clé publique correspondante au client dans le cadre de l'extension Key Share, que nous avons mentionnée juste au-dessus. Encore une fois, composons la clé privée du serveur :
d2eaf909192839425969789b9c7b9c99d939fa0a1a2a3445a6a7afa9aa1abac
- Les messages que le serveur a déjà reçus ou créés. Ces messages seront transmis fonctions de hachage , et les hachages résultants deviendront des entrées à différentes étapes du processus.
Essentiellement, une fonction de hachage peut prendre des entrées de n'importe quelle taille (qu'il s'agisse de la longueur d'un livre ou d'une seule lettre) et renvoyer une chaîne d'une longueur fixe, qui ne peut pas être inversée pour déterminer l'entrée d'origine. La même entrée renvoie toujours la même sortie, et il est statistiquement peu pratique que deux entrées différentes renvoient la même entrée. Ces propriétés rendent les hachages incroyablement utiles en cryptographie.
Lorsque le client génère ses clés, il utilise la clé publique du serveur (qu'il reçoit dans le cadre du (extension Key Share dans le message Server Hello), sa propre clé privée (il a envoyé la clé publique correspondante dans le cadre du message Client Hello ), et des hachages de messages similaires.
Les clés du client et du serveur sont dérivées à l'aide du processus expliqué dans le Calendrier des clés TLS 1.3 section. Ces étapes peuvent sembler inutilement complexes et il est facile de passer à côté de l’importance de ce qui se passe. Prenons donc du recul et analysons le problème fondamental que l’ensemble du processus résout.
Création d'une connexion sécurisée sur un canal non sécurisé
Disons que vous êtes un activiste à l’époque pré-Internet, avec des informations critiques que vous souhaitez transmettre à un journaliste à travers le pays. Le problème est que vous êtes tous les deux ciblés par les autorités, qui surveillent attentivement vos communications.
Vous pourriez envoyer l'information au journaliste dans une lettre, mais il y a de fortes chances que la police l'ouvre et, lorsqu'elle découvrirait l'information, cela mettrait en danger vous et le journaliste. Il en va de même si vous utilisez le téléphone : il pourrait y avoir une écoute électronique.
Une option serait de coder les informations contenues dans la lettre, de sorte que même si les autorités les trouvaient, elles ne sauraient pas ce qu’elles signifient. Mais il faudrait alors également un moyen d’envoyer le code au journaliste afin qu’il puisse le lire. Si vous envoyez le code dans une lettre séparée, les autorités pourraient également l'intercepter et l'utiliser pour décoder le message. Cela pourrait toujours vous causer des ennuis.
Le problème se résume à ceci : si vous ne disposez pas déjà d’un canal sécurisé, comment pouvez-vous échanger en toute sécurité les informations nécessaires à la mise en place d’un canal sécurisé ? Toute personne surveillant la chaîne pourrait utiliser ces mêmes informations pour décrypter toutes les futures communications que vous avez chiffrées.
Le même problème s’applique à la communication en ligne. Comment configurer les clés pour une communication sécurisée sur un canal non sécurisé ? Cela semble être un problème presque impossible à résoudre.
Heureusement, les cryptographes ont travaillé dur pour nous, et grâce à la cryptographie à clé publique, au système d'accord de clé Diffie-Hellman et aux autres mécanismes que nous décrirons, la poignée de main TLS est capable d'établir une connexion sécurisée sur un canal non sécurisé.
Calendrier des clés TLS 1.3
Le calendrier clé utilise le HKDF Extraire et développer fonctionne avec la fonction de hachage sélectionnée dans le cadre de Cipher Suite. Les clés sont établies selon le schéma suivant :
Il existe trois séries de fonctions HKDF Extract et Expand, chacune formant des clés pour différentes étapes de la connexion. La fonction HKDF Extract a deux entrées :
- Le sel
- Le matériel de saisie
La sortie de chaque fonction HKDF Extract est un secret , ce qui devient une des entrées de la fonction HKDF Expand. L'autre entrée de la fonction HKDF Expand est un hachage de divers messages qui ont été envoyés entre le client et le serveur.
Si vous regardez le diagramme, le sel au début du processus est le 0 en haut, tandis que le premier morceau de matériel de saisie est le Clé Pré-Partagée (nous vous expliquerons cela dans un instant) en haut à gauche.
Lors du cycle suivant, le sel est le Derive Secret qui a été produit à la suite du premier cycle des fonctions HKDF Extract et Expand. Lors de ce deuxième tour, le matériel de saisie est le Secret partagé , dont nous parlerons également dans un instant.
Dans le troisième tour, le sel est ce deuxième Derive Secret qui a été produit par le cycle précédent des fonctions HKDF Extract et Expand. Le matériel de saisie est le 0 .
Premier tour : Early Secret
Si le client et le serveur ont déjà établi une clé pré-partagée lors d'une connexion antérieure, cette clé fait office de matériel de chiffrement initial. Lorsqu'il n'y a pas de clé pré-partagée, son entrée est remplacée par une chaîne de zéros de la même longueur que le hachage. Le 0 qui agit comme le premier sel est également une chaîne de zéros de longueur de hachage.
Dans notre cas, puisqu'il n'y a pas de clé pré-partagée en place, les deux entrées dans la fonction HKDF Extract sont des chaînes de zéros. Cette sortie est notre Premier secret , qui est ensuite introduit dans la fonction HKDF Expand aux côtés de hachages de différents messages pour révéler chacun des premiers secrets. Les messages hachés et les secrets qui en résultent sont :
- Une chaîne de zéros – Binder Key
- Le message Client Hello – Client Early Traffic Secret
- Le message Bonjour client – Premier secret principal de l’exportateur
- Une chaîne de zéros – Le secret de la dérive
Puisqu’il n’y a pas de clé pré-partagée dans notre exemple et qu’il n’y aura pas de chiffrement anticipé, tous ces secrets ne sont pas pertinents. Cependant, ils sont toujours produits car le processus est le même à chaque fois, qu’il existe ou non une clé pré-partagée.
Deuxième tour : Poignée de main secrète
Dans ce cycle, nos entrées dans la fonction HKDF Extract sont les Dériver le secret (le sel) produit par le tour précédent, ainsi qu'un Secret partagé (le matériel de chiffrement) qui est calculé en exécutant la clé publique du client et la clé privée du serveur via la courbe elliptique Accord clé Diffie-Hellman schème. Comme nous l'avons mentionné dans le Extension de partage de clé section, la courbe dans cet exemple est Curve25519.
Prenons donc la clé publique du client, que le serveur a reçue dans le Client Hello :
2abaead2e3f909196283942b969c89b9cfb9c994c39fa0a1a253445a6a7afa9
Et la clé privée du Serveur, qu’il garde pour lui (bien qu’il ait envoyé la clé publique correspondante au client) :
d2eaf909192839425969789b9c7b9c99d939fa0a1a2a3445a6a7afa9aa1abac
Après avoir parcouru le schéma, disons qu’il nous donne une valeur de :
4c3945a6a7afa9a2abaead2e3f90919628942b969c89b39cfb9c99fa0a1a2534
La valeur ci-dessus est la Secret partagé . C’est un élément essentiel du fonctionnement de l’ensemble de l’opération. En raison des mathématiques étranges derrière cryptographie à clé publique et le schéma d'accord de clé Diffie-Hellman, il s'agit d'une valeur que le client et le serveur peuvent calculer, sans jamais avoir à se l'envoyer.
Ce secret partagé est crucial pour que les deux parties puissent établir une connexion sécurisée, et il leur permet de le faire même si un attaquant surveille la connexion. Plus tard, lorsque le client génère ses clés, il est capable de calculer ce même secret partagé à partir de la clé publique du serveur et de sa propre clé privée.
Ainsi, nos entrées sont les Dériver le secret , plus ça Secret partagé . Ils sont soumis à la fonction HKDF Extract, ce qui entraîne le Secret de poignée de main . Le Handshake Secret passe par la fonction HKDF Expand ainsi que les hachages de plusieurs messages différents pour produire les secrets de ce tour. Les messages hachés, ainsi que leurs sorties respectives sont :
- Le client Hello et le serveur Hello – Client Handshake Traffic Secret
- Le client Hello et le serveur Hello – Server Handshake Traffic Secret
- Une chaîne de zéros – Derive Secret
Troisième tour : Maître Secret
Dans ce tour, notre sel est le Dériver le secret du tour précédent, et notre matériel de saisie est un chaîne de zéros . Ces valeurs sont transmises via la fonction HKDF Extract, ce qui entraîne le Maître secret . Ce Master Secret est ensuite exécuté via la fonction HKDF Expand aux côtés des hachages des messages suivants pour nous donner leurs secrets respectifs :
- Tous les messages depuis le Client Hello jusqu'au message Terminé du serveur (voir le Fini pour plus de détails sur ce message) – Secret de trafic des applications clientes
- Tous les messages du Client Hello jusqu’au message Terminé du serveur – Secret du trafic des applications serveur
- Tous les messages du Client Hello jusqu’au message Terminé du serveur – Secret principal de l'exportateur
- Tous les messages du Client Hello jusqu’au message Terminé du serveur – Reprise Maître Secret .
Chacune de ces clés joue un rôle dans le processus de prise de contact, mais par souci de simplicité, nous ne les couvrirons pas toutes.
RFC8446
Maintenant que vous avez vu d’où viennent les secrets, nous pouvons jeter un œil aux données cryptées. Bien que nous ne puissions pas voir l'intérieur du cryptage, RFC8446 nous donne un bon aperçu de la poignée de main TLS dans la section 2. Aperçu du protocole. Nous l'avons légèrement modifié pour ajouter un peu plus de clarté :
|_+_|À gauche, nous avons le client et à droite, le serveur. Les flèches indiquent où les données sont envoyées.
Le cluster en haut à gauche montre les détails importants du message Client Hello, qui a été le premier que nous avons examiné. Cela inclut le partage de clé, les algorithmes de signature, les modes d'échange de clé pré-partagée et la clé pré-partagée. Notre capture Wireshark a utilisé l'extension Key Share pour l'échange de clés, de sorte que les deux dernières extensions ne sont pas pertinentes pour notre exemple global.
En descendant, sur la droite, nous avons notre message Server Hello. Nous pouvons voir qu'il inclut l'extension Key Share, où le serveur choisit sa méthode préférée dans la liste du client et envoie la clé publique appropriée.
Vient ensuite l’extension Pre-Shared Key, mais encore une fois, cela n’est pas pertinent pour notre exemple particulier.
Nous avons déjà discuté de chacun des messages répertoriés jusqu'à présent, mais si vous regardez vers le bas du diagramme, vous verrez une légende qui explique la signification des différents symboles. Il est dit que les accolades {} « Indique les messages protégés à l'aide de clés dérivées d'un [sender]_handshake_traffic_secret. » Nous avons également mis en gras les champs pertinents dans le diagramme pour les souligner.
Cela signifie que les aspects suivants du message Server Hello sont tous envoyés au client de manière chiffrée :
{Extensions chiffrées}
{CertificateDemande*}
{Certificat*}
{CertificateVerify*}
{Fini}
Le [expéditeur] dans la légende fait référence soit au client, soit au serveur. Dans ce cas, chacun des champs ci-dessus a été chiffré par du matériel de chiffrement dérivé du secret de trafic de prise de contact du serveur . Ce secret a été produit lors du deuxième tour de la planification des clés, sur la base des entrées précédentes ainsi que du hachage des messages Client Hello et Server Hello. Les clés sont calculées en insérant le Server Handshake Traffic Secret dans les fonctions HKDF Expand aux côtés d'autres entrées.
Si vous revenez à la capture Wireshark du Server Hello, vous remarquerez qu'aucune des sections entourées d'accolades {} n'y est visible. Au lieu de cela, ils font partie des données de l’application qui ont été cryptées. Dans les versions précédentes de TLS, ces informations étaient envoyées sous forme de texte brut.
Extensions cryptées
Les extensions chiffrées dans le message Server Hello sont des réponses aux extensions dans le message Client Hello. Le message Client Hello incluait toutes ces extensions sous forme de texte brut, ce qui nous a permis d'utiliser Wireshark pour examiner les listes d'options que le client proposait au serveur.
Étant donné que les réponses sont chiffrées dans le message Server Hello, nous ne pouvons pas voir quels choix le serveur a sélectionnés. Supposons simplement que le serveur ait accepté chacune des premières préférences du client.
Demande de certificat
L'aspect suivant est Demande de certificat , qui est parfois également utilisé par le serveur pour authentifier le client. Il n’est pas aussi courant d’authentifier les clients, car un visiteur frauduleux est généralement moins dangereux pour un site Web qu’un site Web frauduleux ne l’est pour un visiteur.
Lorsque le serveur envoie une demande de certificat dans le cadre de son message Server Hello, il indique les paramètres souhaités que le client doit respecter pour s'authentifier et prouver qu'il est bien celui qu'il prétend être.
Que sont les certificats ?
La partie Certificat du Server Hello est la première étape permettant au serveur de s'authentifier auprès du client dans TLS. Mais si on y va trop vite, cela risque de devenir un peu déroutant.
Tout d’abord, revenons en arrière et expliquons brièvement ce que sont réellement les certificats et le rôle qu’ils jouent. Si l’objectif de TLS est de sécuriser nos données et de nous assurer confidentialité, intégrité et authenticité, alors nous devons prendre en compte une chose importante. Lorsque nous établissons un lien avec un autre parti, comment savoir qu’il est vraiment celui qu’il prétend être ?
Par exemple, lorsque vous vous connectez à Comparitech, comment pouvez-vous savoir que vous nous visitez réellement, et non un site Web frauduleux ? Peu importe la sécurité de votre connexion si la personne de l’autre côté était réellement un fraudeur ou un cybercriminel.
Il existe différentes manières de résoudre ce problème, mais TLS utilise des certificats de clé publique. Essentiellement, Comparitech s'adresse à un organisme de confiance appelé autorité de certification. Les autorités de certification courantes incluent DigiCert, GlobalSign et Symantec. Comparitech apporte à l'une de ces organisations une série de documents prouvant qu'elle est Comparitech et qu'elle est propriétaire de comparitech.com.
L'autorité de certification les examine, et comme Comparitech est en réalité l'entité qu'elle prétend être, l'autorité de certification lui délivre un certificat. Ce certificat comprend des éléments tels que le nom du site Web, une clé publique et une signature numérique de l'autorité de certification. . La signature numérique indique que l'autorité de certification a vérifié que Comparitech est bien celui qu'elle prétend être et se porte garante de Comparitech.
Tant que vous faites confiance à l’autorité de certification et que le certificat n’a pas expiré, vous pouvez vous sentir en sécurité lorsque vous vous connectez à Comparitech, car l’autorité de certification l’a vérifié pour vous. Vous pouvez vérifier le certificat de Comparitech en cliquant sur l'icône de verrouillage à gauche de la barre d'adresse, puis en suivant les options du menu.
Maintenant que nous avons expliqué le fonctionnement général des certificats, il est temps de revenir à l’examen de ce qui se passe lors de la négociation TLS. Lorsque votre navigateur Web (le client) commence à se connecter à un serveur, il veut savoir si le site est légitime. Il veut vous protéger contre la visite accidentelle d’un site Web frauduleux. Les sites Web légitimes souhaitent également que votre navigateur s'y connecte au lieu de vous diriger vers un imposteur. Alors, comment fonctionnent les certificats dans le contexte de TLS 1.3 ?
Certificat
À moins que des clés pré-partagées ne soient utilisées (via l'extension Pre-Shared Key), le serveur doit envoyer un message de certificat dans le cadre de son Server Hello. Le certificat comprend le nom d'hôte du serveur, une clé publique et une signature numérique d'une autorité de certification. Comme nous venons de le mentionner, la signature de l’autorité de certification indique qu’elle a vérifié l’identité du serveur. Tant que votre client fait confiance à l'autorité de certification, il peut être sûr que la clé publique appartient réellement à l'hôte et que le serveur est réellement celui qu'il prétend être.
La clé publique de ce certificat possède une clé privée correspondante, que le serveur garde secrète pour tout le monde. Cela deviendra important dans la section suivante.
Le certificat peut également inclure des extensions supplémentaires, mais y entrer compliquerait inutilement notre explication.
Vérification du certificat
Le travail du message de vérification du certificat est de prouver que le serveur possède réellement le certificat qu'il envoie au client. Pour ce faire, il faut d'abord prend le hachage des messages Client Hello et Server Hello, puis le signe avec la clé privée qui correspond à la clé publique sur le certificat. Cette signature numérique est calculée avec l'algorithme de signature sélectionné par le serveur dans la liste des clients dans l'extension Signature Algorithms.
Lorsque le client reçoit le message de vérification du certificat, il doit vérifier la signature. Pour ce faire, il envoie à la fois la signature numérique (envoyée dans le message de vérification du certificat du serveur) et la clé publique (du certificat du serveur) dans un algorithme.
Si le certificat et la signature numérique du serveur sont légitimes, le résultat de l'algorithme sera exactement le même que le hachage créé par le serveur en plaçant les messages Client Hello et Server Hello via une fonction de hachage. Étant donné que le client a accès à ces deux messages, il peut vérifier le client en plaçant ces deux messages via la même fonction de hachage.
Le client compare ensuite la sortie de la fonction de hachage avec la sortie de l'algorithme précédent. Si les deux valeurs correspondent, alors la signature numérique et le certificat sont légitimes et le client vérifie le serveur. Si les valeurs ne correspondent pas, le client met fin à la négociation.
Si vous êtes curieux de savoir comment cela fonctionne plus en détail, le Rubrique RSA de notre article sur les signatures numériques donne un aperçu plus détaillé de la manière dont le hachage d'un message peut être signé et de la manière dont cette signature peut être vérifiée.
Fini
Le message Terminé du serveur permet au client de vérifier que la négociation s'est terminée avec succès et qu'elle n'a pas été modifiée. La première étape du calcul des données de vérification consiste à calculer un Clé terminée en mettant la clé de trafic du serveur Handshake (du Génération de clé TLS section) via la fonction HKDF Expand. La clé terminée et un hachage de tous les messages précédents passent ensuite par une fonction de hachage pour former un code d'authentification de message basé sur le hachage (HMAC).
Le client doit vérifier ce message Terminé une fois qu'il l'a reçu. Si le contenu du message est incorrect, il doit mettre fin à la connexion. A ce stade de la connexion, le serveur peut commencer à envoyer les données de l'application au client.
Application Data
Si vous vous référez au schéma du début du RFC8446 section, vous verrez que les sections suivantes sont toutes entourées d'accolades {} :
{Extensions chiffrées}
{CertificateDemande*}
{Certificat*}
{CertificateVerify*}
{Fini}
Alors que les données d'application ont des parenthèses standard :
[Application Data*]
Le diagramme indique que les messages entourés de crochets standard sont « protégés à l’aide de clés dérivées de [sender]_application_traffic_secret_N ». Cela signifie que contrairement aux messages précédents, les données d'application sont non chiffré avec du matériel de chiffrement dérivé du secret de trafic de prise de contact du serveur . Au lieu de cela, les données d'application sont chiffré avec des éléments de chiffrement dérivés du secret de trafic de l'application serveur . Ces matériaux de saisie sont calculés en exécutant le Secret de trafic d'application serveur via la fonction HKDF Expand .
Le matériel de chiffrement dérivé du secret de trafic de l'application serveur ne peut pas être utilisé pour chiffrer les messages précédents car il ne peut être calculé qu'après l'envoi du message Terminé. En effet, le message Terminé est un composant du hachage utilisé par le secret de trafic de l'application serveur. Une fois le message Terminé envoyé, toutes les données doivent être cryptées avec ces nouvelles clés dérivées du Server Application Traffic Secret.
À ce stade, le rôle du serveur dans la négociation TLS est terminé, à moins qu’il n’authentifie également le client. Si le serveur authentifie le client, ses réponses aux messages de certificat et de vérification de certificat du client doivent également être chiffrées avec le matériel de chiffrement dérivé du secret de trafic de l'application serveur.
Les dernières étapes du client
Maintenant que le serveur a établi ses clés, envoyé au client tout ce dont il a besoin pour l'authentification et a même commencé à envoyer les données de l'application, examinons ce que le client doit faire pour terminer sa partie de la poignée de main :
|_+_|Si nous regardons vers le bas à gauche, nous voyons que le client a trois messages liés à l'authentification ; Certificat, vérification du certificat et terminé . Vous remarquerez également que ces messages sont entourés d'accolades {}, indiquant qu'ils ont été chiffrés par des clés dérivées du Secret de trafic de prise de contact client . Ces clés ont été dérivées presque exactement de la même manière que le serveur a dérivé ses clés équivalentes.
Nous vous épargnerons la répétition du processus de génération de clé. Le calendrier clé fonctionne comme indiqué dans le Calendrier des clés TLS 1.3 section. La chose la plus importante à retenir est que toutes les étapes épuisantes de la planification des clés ont permis au client et au serveur d'établir un secret partagé qui leur permet ensuite d'établir une connexion sécurisée sur un canal non sécurisé. Même si le client n’a pas accès aux clés privées du serveur et vice-versa, ces bizarreries cryptographiques leur permettent toujours de lire les messages cryptés les uns des autres, sans jamais avoir à envoyer la clé via un canal non sécurisé.
Certificat
Le client ne doit envoyer un message de certificat que si le serveur a envoyé un message de demande de certificat demandant l'authentification du client. Si tel est le cas, il doit envoyer au serveur un certificat répondant aux paramètres du serveur. Tout comme le certificat du serveur, il doit inclure son nom d'hôte, sa clé publique et une signature numérique d'une autorité de certification qui prouve que le client est bien celui qu'il prétend être.
Le certificat du client possède également une clé privée correspondante, qu'il ne révèle jamais à personne d'autre, mais il l'utilise dans le cadre de son message de vérification du certificat.
Vérification du certificat
Encore une fois, le client envoie le message de vérification du certificat uniquement si le serveur a demandé l'authentification du client. Lorsque l'authentification du client est requise, le client prouve qu'il possède le certificat de la même manière que le serveur le fait dans la section Vérification du certificat précédente. Le serveur vérifie également le message en suivant les mêmes étapes.
Fini
Le message Terminé est le message final du client dans le processus de prise de contact de base. C'est similaire au message Terminé du serveur, sauf que le Clé terminée utilisé dans le cadre du HMAC est calculé à partir de la clé de trafic de prise de contact client plutôt que de la clé de trafic de prise de contact du serveur.
Lorsque le serveur reçoit le message Terminé du client, il doit en vérifier le contenu. S'ils sont incorrects, il doit mettre fin à la connexion.
Application Data
Une fois que le client a envoyé son message Terminé, il peut commencer à transmettre les données de l'application au serveur. De la même manière que le serveur utilise des clés différentes pour ses données d'application, le client s'éloigne des clés qu'il utilisait dans ses messages chiffrés antérieurs. Les données d'application du client sont cryptées avec des éléments de chiffrement dérivés du secret de trafic de l'application client, par le même moyen que les éléments de chiffrement des données d'application du serveur ont été calculés.
À ce stade, la négociation de base TLS est terminée et le client et le serveur peuvent envoyer librement des données d'application via une connexion TLS 1.3 sécurisée. Bien qu'il nous ait fallu beaucoup de temps pour décrire tous les détails complexes, l'ensemble de ce processus peut se dérouler dans les quelques instants qu'il faut entre le clic sur une URL et l'arrivée sur le site Web.