Lors de l'établissement d'une connexion TLS, un handshake s'effectue entre un client et un serveur. Au cours de ce processus, un message client hello (ClientHello) ainsi qu'un message server hello (ServerHello) sont échangés[1]. En premier lieu, le client émet au serveur la liste des suites cryptographiques qu'il supporte, par ordre de préférence (de la plus robuste à la plus faible). En retour, le serveur renvoie la suite cryptographique préférée pour l'établissement de la communication[2].
Il est possible d'obtenir la liste des suites cryptographiques supportées par un serveur à l'aide de logiciels scanner SSL/TLS (TLSSLed[3] ou TestSSLServer[4] par exemple).
L'algorithme d'échange de clés est utilisé pour déterminer la méthode permettant au client et au serveur d'établir un canal de communication sécurisé (chiffrement asymétrique).
L'algorithme d'authentification est utilisé pour déterminer si et comment le client et le serveur vont s'authentifier mutuellement durant la poignée de main[7] ;
L'algorithme de code d'authentification de message (MAC) est utilisé pour créer un condensat (ou empreinte) afin de vérifier l'intégrité de chaque bloc composant le flux de données[8].
De plus, une fonction pseudo-aléatoire (PRF) est utilisée pour générer un secret partagé de 48 octets et utilisé entre les deux pairs lors de la connexion.
Le secret partagé est utilisé comme source d'entropie lors de la création de la clé de session, utilisé pour la génération du MAC[9].
Par exemple, la suite ECDHE-RSA-AES128-GCM-SHA256 utilise l'algorithme ECDHE pour l'échange de clés, RSA pour l'authentification, AES (128bits) en mode GCM pour le chiffrement par bloc et enfin SHA256 pour le calcul du MAC.
Il existe un très grand nombre de suites cryptographiques supportés dans OpenSSL[10]. Certaines ne proposent pas d'authentification, ni chiffrement, ni contrôle d'intégrité.
Pour TLS, un HMAC basé sur l'algorithme MD5 ou l'un des algorithmes de hachage SHA peut être utilisé. Pour SSL, SHA, MD5, MD4 et MD2 peuvent être utilisés.
Références en programmation
En programmation, la syntaxe différencie deux éléments :
CipherSuite cipher_suites
représente la liste des suites cryptographiques supportées par le client[11].
CipherSuite cipher_suite
représente la suite cryptographique sélectionnée par le serveur et retournée dans le message ServerHello[12].