Aller au contenu principal

8. Ajustements spécifiques à QUIC du handshake TLS (QUIC-Specific Adjustments to the TLS Handshake)

Lorsqu'il est utilisé avec QUIC, certains aspects du handshake TLS sont différents.

QUIC exige également que le handshake cryptographique fournisse une négociation authentifiée des paramètres qui sont critiques pour la sécurité et les performances. En plus de la négociation des paramètres cryptographiques, le handshake TLS transporte et valide également les valeurs des paramètres de transport QUIC.

8.1. Négociation de protocole (Protocol Negotiation)

QUIC exige que le handshake cryptographique fournisse une négociation de protocole authentifiée. TLS utilise Application-Layer Protocol Negotiation (ALPN) [ALPN] pour sélectionner un protocole d'application. À moins qu'un autre mécanisme ne soit utilisé pour convenir d'un protocole d'application, les endpoints doivent (MUST) utiliser ALPN à cette fin.

Lors de l'utilisation d'ALPN, les endpoints doivent (MUST) fermer immédiatement la connexion (voir Section 10.2 de [QUIC-TRANSPORT]) avec une alerte TLS no_application_protocol (code d'erreur QUIC 0x0178 ; voir Section 4.8) si aucun protocole d'application n'est négocié. [ALPN] spécifie que seuls les serveurs utilisent cette alerte, mais les clients QUIC doivent (MUST) utiliser l'erreur 0x0178 pour terminer une connexion lorsque la négociation ALPN échoue.

Un protocole d'application peut (MAY) restreindre les versions de QUIC qui peuvent être utilisées. Les serveurs doivent (MUST) sélectionner un protocole d'application compatible avec la version QUIC sélectionnée par le client. Le serveur doit (MUST) traiter l'incapacité à sélectionner un protocole d'application compatible comme une erreur de connexion de type 0x0178 (no_application_protocol). De même, un client doit (MUST) traiter la sélection d'un protocole d'application incompatible par le serveur comme une erreur de connexion de type 0x0178.

8.2. Extension des paramètres de transport QUIC (QUIC Transport Parameters Extension)

Les paramètres de transport QUIC sont transportés dans une extension TLS. Différentes versions de QUIC peuvent définir différentes méthodes pour négocier la configuration du transport.

L'inclusion des paramètres de transport dans le handshake TLS fournit une protection d'intégrité pour ces valeurs.

enum {
quic_transport_parameters(0x39), (65535)
} ExtensionType;

Le champ extension_data de l'extension quic_transport_parameters contient une valeur définie par la version de QUIC en cours d'utilisation.

L'extension quic_transport_parameters est transportée dans les messages ClientHello et EncryptedExtensions pendant le handshake. Les endpoints doivent (MUST) envoyer l'extension quic_transport_parameters. Un endpoint qui reçoit un ClientHello ou EncryptedExtensions sans l'extension quic_transport_parameters doit (MUST) fermer la connexion avec une erreur de type 0x016d (équivalent à une alerte TLS fatale missing_extension ; voir Section 4.8).

Les paramètres de transport deviennent disponibles avant la fin du handshake. Un serveur peut utiliser ces valeurs avant la fin du handshake. Cependant, les valeurs des paramètres de transport ne sont pas authentifiées avant la fin du handshake, donc toute utilisation de ces paramètres ne peut pas se fier à leur authenticité. La falsification des paramètres de transport entraînera l'échec du handshake.

Les endpoints ne doivent pas (MUST NOT) envoyer cette extension dans une connexion TLS qui n'utilise pas QUIC (comme l'utilisation de TLS sur TCP définie dans [TLS13]). Une implémentation qui supporte cette extension doit (MUST) envoyer une alerte fatale unsupported_extension si elle reçoit cette extension lorsque le transport n'est pas QUIC.

La négociation de l'extension quic_transport_parameters supprime EndOfEarlyData (voir Section 8.3).

8.3. Suppression du message EndOfEarlyData (Removing the EndOfEarlyData Message)

Le message TLS EndOfEarlyData n'est pas utilisé avec QUIC. QUIC ne dépend pas de ce message pour marquer la fin des données 0-RTT ou pour signaler la transition vers les clés Handshake.

Les clients ne doivent pas (MUST NOT) envoyer le message EndOfEarlyData. Un serveur doit (MUST) traiter la réception d'une trame CRYPTO dans un paquet de données 0-RTT comme une erreur de connexion de type PROTOCOL_VIOLATION.

En conséquence, EndOfEarlyData n'apparaît pas dans la transcription du handshake TLS.

8.4. Interdiction du mode de compatibilité middlebox TLS (Prohibiting TLS Middlebox Compatibility Mode)

L'Annexe D.4 de [TLS13] décrit une modification du handshake TLS 1.3 comme solution de contournement pour des bugs dans certains middleboxes. Le mode de compatibilité middlebox TLS 1.3 implique de définir le champ legacy_session_id dans ClientHello et ServerHello sur une valeur de 32 octets et d'envoyer un enregistrement change_cipher_spec. Ni le champ ni l'enregistrement ne portent de contenu sémantique et sont ignorés.

Ce mode n'est pas utile dans QUIC car il s'applique uniquement aux middleboxes qui interfèrent avec TLS sur TCP. QUIC ne fournit même pas de moyen de transporter des enregistrements change_cipher_spec. Les clients ne doivent pas (MUST NOT) demander l'utilisation du mode de compatibilité TLS 1.3. Un serveur devrait (SHOULD) traiter la réception d'un TLS ClientHello avec un champ legacy_session_id non vide comme une erreur de connexion de type PROTOCOL_VIOLATION.