|
SSL et TLS
par Vincent LIMORTE, François VERRY et Sébastien FONTAINE (_SebF)
1 - Généralités
1.1 -
Positionnement des protocoles SSL et TLS
1.2 -
Objectifs et moyens mis en
oeuvre
1.3 - Fonctionnement
1.4 - Plan de ce document
2 -
Présentation de
SSL et TLS
2.1 - Historique
2.2 -
Perspectives actuelles
2.3 - Contexte technique
2.3.1 - Implémentations de SSL et TLS
2.3.2 - Certification
2.3.3 -
SSL et TLS par rapport aux autres solutions
2.4 -
Les ports et
applications utilisant SSL et TLS
3 - Aspects cryptographiques
3.1 -
Chiffrement symétrique ou à clé
secrète
3.2 -
Chiffrement asymétrique ou clé
publique
3.2.1 - Chiffrement
3.2.2 - Signature
3.2.3 - Une première limite
3.2.4 - Signature et hachage
3.3 -
Apparition de la notion de
Certification
3.3.1 - L'attaque par le milieu
3.3.2 - Se prémunir contre l'attaque par le milieu
3.3.3 - La certification X.509
4 - Le protocole SSL et TLS
4.1 -
Le protocole Hanshake
4.1.1 - Format d'échange
4.1.2 - Détail des échanges
4.2 -
Le protocole Change Cipher Spec
4.3 - Le protocole Alarm
4.4 - Le protocole Record
4.4.1 - Rôle
4.4.2 - Processus d'encapsulation
4.4.3 - Réceptions des paquets
5 - Faiblesses et attaques envisageables
5.1 - Limites
5.2 -
Un scénario d'attaque
6 - Conclusion
7 - Discussion autour de la
documentation
8 - Suivi du document
SSL signifie Secure Sockets Layer et son
équivalent actuel TLS signifie Transport Secured Layer. Ils sont tous les deux
des protocoles situés entre le niveau Transport et Application. Ainsi, on
retrouve leur positionnement sur le schéma suivant représentant le
modèle OSI et TCP/IP

SSL et TLS se comportent en effet comme une
couche intermédiaire
supplémentaire, car ils sont indépendants du protocole utilisé au niveau
application. Cela signifie donc qu'il peut aussi bien être employé pour sécuriser
une transaction web, l'envoi ou la réception d'email, etc. SSL et TLS sont donc
transparents pour l'utilisateur et ne nécessitent pas l'emploi de protocoles de
niveau Application spécifiques.
SSL et TLS proposent les fonctionnalités
suivantes :
Authentification - Le client doit
pouvoir
s'assurer de l'identité du serveur. Depuis SSL 3.0, le serveur peut aussi
demander au client de s'authentifier. Cette fonctionnalité est assurée par
l'emploi
de certificats.
Confidentialité - Le client et le
serveur doivent avoir l'assurance que
leur conversationne pourra pas être écoutée par un tiers. Cette fonctionnalité
est assurée par un algorithme de chiffrement.
Identification et intégrité - Le
client et le serveur doivent pouvoir s'assurer que les messages transmis ne sont
ni
tronqués ni modifiés (intégrité), qu'ils proviennent bien de l'expéditeur
attendu.
Ces fonctionnalités sont assurées par la signature des données.
SSL et TLS reposent donc sur la combinaison
de plusieurs concepts cryptographiques, exploitant la
fois le chiffrement asymétrique et le chiffrement symétrique.
SSL et TLS se veut en outre évolutif,
puisque le protocole est indépendant des algorithme de cryptage
et d'authentification mis en oeuvre dans une transaction. Cela lui permet
de s'adapter aux besoins des utilisateurs et aux législations en vigueur. Cela
assure de plus une meilleure sécurité, puisque le protocole n'est pas soumis aux
évolutions théoriques de la cryptographie (Si un chiffrement devient obsolète,
le
protocole reste exploitable en choisissant un chiffrement réputé sûr).
Le protocole SSL et TLS se décompose en
deux couches principales
(quatre en réalité) :
SSL et TLS Handshake Protocol
choisit la version de SSL et TLS qui
sera utilisée, réalise l'authentification par l'échange de certificats et
permet la
négociation entre le client et le serveur d'un niveau de sécurité au travers du
choix des algorithmes de cryptage. C'est le protocole de configuration de la
transaction.
SSL et TLS Record Protocol encapsule
et fragmente les données. C'est le
protocole de transmission des données.
Dans une première phase, le client et le
serveur vont effectuer la négociation an de configurer la transaction et
d'échanger
les clés de chiffrement. Puis ils effectueront l'échange de données proprement
dit.
Ce document présente dans un premier
temps l'évolution
de SSL depuis sa création jusqu'à l'apparition du protocole actuel TLS et ses
différentes perspectives d'avenir. Il replace aussi SSL dans le contexte des
différentes solutions existantes de
sécurisation des transactions sur le réseau. Puis nous rappelleront les concepts
cryptographiques mis en oeuvre. Nous détaillerons ensuite le fonctionnement
technique des protocoles SSL et TLS. Enfin, nous évoquerons les limites de ces
protocoles en matière de sécurité.
Voici l'historique des protocoles SSL et TLS
par sortie de version :
SSL 1.0 1994 Netscape
SSL 2.0 Février
1995 Netscape The SSL
Protocol Version 2.0
SSL 3.0 Novembre
1996 Netscape The SSL
Protocol Version 3.0
TLS 1.0 Janvier
1999 IETF RFC 2246
Extensions TLS Juin
2003 IETF RFC 3546
Extensions TLS Avril 2006 IETF
RFC 4366
La première version de SSL a été
développée
par Netscape Communications en 1994. L'objectif de Netscape était de créer un
canal sécurisé où les données pourraient transiter entre un client et un
serveur,
indépendamment de la plateforme et du système d'exploitation. Netscape
souhaitait
aussi pouvoir bénéficier des nouvelles méthodes de chiffrage, telles AES (Advanced Encryption Standard), qui
venait
de remplacer le chiffrement DES (Data Encryption Standard).
Quoique SSL soit destiné l'origine
uniquement
sécuriser les transactions entre un client et un serveur web (HTTP), la
spécification a été connue de faon ce que les autres protocoles de niveau
application puissent l'exploiter (FTP, Telnet, etc.). La spécification SSL 1.0
ne
fut diffusée qu'en interne et aucune application ne supportera SSL 1.0.
Quelques mois plus tard, en février
1995, Netscape publie la
version 2.0 du protocole.
Il est implémenté dans la première version de son client web Navigator. SSL 2.0
se fonde sur l'authentification du serveur par le poste client et sur
l'utilisation
d'un certificat serveur au format X.509 v3. Cette authentification ne nécessite,
du
côté du poste client, que des calculs en clé publique.
En novembre 1996, Netscape publie la
version 3.0 du protocole. Par rapport SSL 2.0, SSL 3.0 offre en plus la
capacité, pour le serveur, d'authentifier le client. Dans ce cas, le client doit
pouvoir d'une part exploiter sa clé privée et d'autre part fournir son
certificat au format X.509 v3.
L'IETF (Internet Engineering Task Force) propose son tour un protocole de
transfert sécurisé basé sur les concepts de SSL, baptisé
TLS 1.0 (parfois nommée SSL 3.1) et décrit dans la RFC 2246. Elle rachète le
brevet de Netscape sur le protocole SLL en 2001. Puis en juin 2003, des
extensions sont proposées pour TLS sous la forme d'une nouvelle RFC. La dernière
RFC 4366, updatant la précédente, est sortie en Avril 2006.
A l'heure actuelle, les protocoles SSL
2.0, SSL 3.0 et TLS 1.0 sont utilisés. La
version 2.0 de SSL présente cependant des failles de sécurité connues, ce qui
représente une contre indication son emploi.
Comme il a été mentionné ci-dessus, SSL
et TLS
sont des protocoles transparents pour l'utilisateur,
situés entre les couches Application et Transport. De nombreux protocoles
peuvent
donc exploiter SSL et TLS, tels HTTP (HTTPS), LDAP (LDAPS), etc.
Cependant, si SSL et TLS est transparent au
niveau des protocoles, il ne
l'est pas au niveau des applications qui l'exploitent. Celles ci nécessitent
donc
individuellement des aménagements pour prendre en compte SSL et TLS. L'une des
faiblesses de SSL et TLS est de donc disposer d'un nombre encore relativement
réduit
d'implémentations.
Implémentations dans les
navigateurs web
La majeure partie des implémentations de
SSL et TLS se trouve
dans les navigateurs et serveurs web. Le serveur Apache, notamment, peut
exploiter
SSL grâce une implémentation basée sur OpenSSL.
OpenSSL
Implémenté en C, OpenSSL est une boîte à
outils de chiffrement comportant deux bibliothèques (une de cryptographie
générale et une implémentant le protocole SSL), ainsi qu'une commande en ligne.
OpenSSL supporte SSL 2.0, SSL 3.0 et TLS 1.0. OpenSSL est distribué sous une
licence de type Apache.
GnuTLS
Le projet GnuTLS propose une
implémentation du protocole TLS conforme aux spécifications de l'IETF. GnuTLS
supporte TLS 1.1,
TLS 1.0, SSL 3.0 et les extensions TLS. Il permet l'authentification via les
certificats X509 et PGP. A la différence d'OpenSSL, GnuTLS est compatible avec
les
licences GPL.
Ainsi que nous le verrons dans la
présentation des
concepts cryptographiques, le principal risque
associé l'utilisation de SSL et TLS est le détournement des certificats. An de
parer
ce risque, il importe de se doter d'autorités de certifications,destinées
valider
ou invalider les certificats. Deux philosophies s'affrontent.
La certification X.509
La certification X.509 repose sur le
principe d'autorités centralisées, dont
le rôle est détenir jour une liste des certificats valides. Elle doit aussi
révoquer les certificats expirés, douteux, etc. L'utilisateur se réfère cette
autorité chaque fois qu'il veut contrôler la validité d'un certificat. Ces
autorités
sont organisées hiérarchiquement, de faon que la plus haute soit une autorité de
confiance maximale. Le rôle d'une autorité supérieure est de valider les
autorités
qui dépendent d'elle.
La certification PGP
La certification PGP (Pretty Good
Privacy) est basée sur la
philosophie Les amis de mes amis sont mes amis . En effet, la validité des
certificats se transmet de pair pair : si un utilisateur valide ou invalide un
certificat, il transmet l'information aux utilisateurs avec lesquels il est
directement en relation (il s'agit donc d'utilisateurs de confiance). De proche
en
proche,la certification se transmet.
Les inconvénients majeurs de PGP, sont
d'une
part la difficulté invalider un certificat s'il a été au préalable reconnu par
beaucoup d'utilisateurs et d'autre part le problème savoir si les réseaux de
confiance peuvent être suffisamment fiables.
Les protocoles SSL et TLS ont choisi de se
baser sur les certifications X.509.
D'autres protocoles permettent d'assurer
la sécurité sur le réseau. Bien que proposant des
fonctionnalités concurrentes de SSL et TLS, ils sont plutôt considérés comme
complémentaires.
SSH
SSH est un protocole de niveau application qui
propose une alternative sécurisée aux utilitaires classiques (rlogin, rsh,
telnet) qui n'offrent pas de confidentialité. La possibilité d'exploiter un mécanisme
de tunneling rend SSH, comme SSL et TLS compatible avec les autres protocoles de
niveau application déjà existant. Tout comme SSL et TLS, SSH
assure l'authentification
des machines, la confidentialité et l'intégrité des données. Il assure
aussi l'authentification des utilisateurs par mot de passe.
SSH souffre de
faiblesses
par rapport SSL et TLS : il n'intègre pas la notion de certificats X509 v3, nécessite
l'installation d'une application cliente spécifique (pas de transparence).De plus,
la notion de tunneling reste difficile appréhender.
Cependant, SSH est moins
vulnérable que SSL et TLS en matière d'identification du client. En effet, la protection
du certificat sur un poste client ne peut pas toujours être correctement
assurée.
IPSec
IPSec fournit un mécanisme de sécurisation au niveau de la
couche réseau (IP). Il est utilisé notamment pour la mise en oeuvre de
réseaux
privés virtuels (VPN). Les fonctionnalités d'IPSec sont l'authentification des
machines, la confidentialité et l'intégrité des transactions.
Son implémentation
indissociable de la prochaine version du protocole IP, IPv6, entre en concurrence
avec les fonctionnalités de confidentialité et d'intégrité de SSL et TLS. Elle offre en
outre une sécurisation du réseau dans sa globalité et non des applications au
cas par cas.
Cependant, IPSec ne peut assurer l'authentification des utilisateurs,
ce qui pose le problème de la fiabilité des postes individuels. De plus, étant
encore une technologie jeune,il se pose les problèmes de manque de recul et
d'interopérabilité.
A ce jour, donc, les
fonctionnalités de sécurité d'IPSec et
IPv6 sont vues comme un important complément la sécurité offerte par
SSL et TLS.
SET/3D-Secure
Basé sur SSL et TLS, les protocoles SET (aujourd'hui
obsolète) et 3D-Secure proposent une authentification validée par un tiers. Ces
protocoles sont principalement destinés aux applications de paiement en ligne
(ils sont développés par des institutions bancaires). Si SSL et TLS et SET/3D-Secure
assurent chacun un haut degré de confidentialité, seul le SET permet une pleine
identification réciproque des deux
parties grâce un tiers de confiance,en l'occurrence la banque du vendeur. Ainsi,
elle assure le vendeur que la carte est bonne et qu'elle n'a pas été volée et le
client qu'aucune utilisation malveillante ne sera faite de ces informations.
On
voit ici que, quoique souffrant de limitations, l'univers SSL et TLS est vaste et
stable.
Voici la liste des applications
exploitant SSL et TLS avec leurs ports TCP associés :
Protocole : NSIIOPS
Port TCP : 261
Description : IIOP
Name Service sur SSL et TLS
Protocole : HTTPS
Port TCP : 443
Description : HTTP sur SSL et TLS
Protocole : DDM-SSL
Port TCP : 448
Description : DDM-SSL
Protocole : SMTPS
Port TCP : 465
Description : SMTP
sur SSL et TLS
Protocole : NNTPS
Port TCP : 563
Description : NNTP sur SSL et TLS
Protocole : SSHELL
Port TCP : 614
Description : SSL Shell
Protocole : LDAPS
Port TCP : 636
Description : LDAP sur SSL et TLS
Protocole : FTPS-DATA
Port TCP : 989
Description : FTP données sur SSL et TLS
Protocole : FTPS
Port TCP : 990
Description : FTP controle sur SSL et TLS
Protocole : TELNETS
Port TCP : 992
Description : Telnet sur SSL et TLS
Protocole : IMAPS
Port TCP : 993
Description : IMAP4 sur SSL et TLS
Protocole : IRCS
Port TCP : 994
Description : IRC sur SSL et TLS
Protocole : POP3S
Port TCP : 995
Description : POP3 sur SSL et TLS
Les concepts mis en oeuvre dans SSL et
TLS reposent
sur des notions de cryptographie usuelles. SSL et TLS utilise en effet des méthodes de
chiffrement symétrique et asymétrique pour assurer ses diverses fonctions :
authentification, signature, intégrité et identification.
Sans aborder les
algorithmes exploités, il est néanmoins intéressant de se pencher sur les bases
cryptographiques qui ont donné naissance aux protocoles.
Mathématiquement, les
protocoles d'échange de messages, appelés cryptosystèmes, sont représentés sous
forme d'un quintuplet

M représente l'ensemble des messages
clairs
C l'ensemble des messages codés
K l'ensemble des clés
E l'ensemble des fonctions de chiffrement (c'est dire un ensemble de la forme :

D l'ensemble des fonctions de déchiffrement (c'est dire un ensemble de la forme
:

Le
chiffrement
symétrique, dit aussi clé secrète est la forme la plus ancienne de cryptage.
Elle consiste utiliser une valeur courte (la clé) pour rendre un message
inintelligible aux tierces parties.
Elle est dite symétrique car cette même clé
permet ceux qui en ont connaissance de déchiffrer le message et ainsi d'accéder
son contenu.
Mathématiquement, un cryptosystème clef secrète est donc déni par la
condition :

Concernant l'implémentation d'un protocole de
sécurité, le
chiffrement symétrique est intéressant car il est simple mettre en oeuvre et
requiert un faible temps de calcul. Il valide la contrainte de
confidentialité,aussi longtemps que la clé reste secrète.
Cependant, il présente un
inconvénient majeur : la difficulté de protéger le secret d'une clé. En effet, au
moment ou les deux parties échangent leur clé secrète, ils ne peuvent
pas s'assurer que celle ci n'est pas interceptée par un tiers. Cette solution
s'avère donc, seule, insuffisante.
Le chiffrement asymétrique, dit aussi clé publique découle de
découvertes
théoriques relativement récentes dans le domaine mathématique. Il repose sur
l'existence de fonctions mathématiques difficiles inverser, sauf en exploitant une
brèche secrète.
La clé du cryptosystème est ici un couple (kprivate, kpublic).
kprivate est connue du seul récipiendaire des messages et kpublic est
universellement connue.
Les fonctions de codage et de décodage deviennent alors
respectivement ekpublic et dkpublic, kprivate, c'est dire qu'il est possible toute
personne de coder un message, mais que seul le détenteur de la clé privée
(récipiendaire du message) est capable de le décoder.
On l'appelle donc
asymétrique, car il est facile pour un utilisateur quelconque de coder un
message, mais difficile de décoder ce message. Le chiffrement asymétrique permet
donc de s'assurer de l'identité du destinataire.
La signature
permet de s'assurer de l'identité de l'expéditeur d'un message. Les méthodes de
signature, exploitent en réalité un protocole inverse de celui du
chiffrement.
L'expéditeur va coder un message donné avec sa clé privée. Lui seul
en
est capable. En revanche, n'importe qui peut vérifier que le message a été codé par
l'expéditeur, en le décodant avec la clé publique et en vérifiant qu'il correspond
bien au message d'origine.
En effet, on utilise pour la signature une fonction
brèche secrète telle que :

Comme seul l'expéditeur souhaité
connais d(), le récipiendaire peut s'assurer que la communication reçue en
vérifiant
que :

Cependant, si ce procédé identifie l'expéditeur, il possède
l'inconvénient de rendre le message transmis déchiffrable par tous.
Il est donc théoriquement
possible d'utiliser un empilement de deux cryptosystèmes, l'un de signature clé
publique, l'autre de chiffrement clé publique : ainsi, les deux
parties s'identifient
l'une et l'autre, chacune connaissant la clé publique de leur interlocuteur.
Cependant, les algorithmes a clé secrète sont
gourmands en ressources, tant pour le codage que le décodage et c'est pourquoi
cette solution ne pouvait être adoptée dans le protocole SSL et TLS. Le cryptage
asymétrique a donc été associé aux étapes critiques du protocole : l'échange des
clés secrètes, permettant l'emploi sécurisé de chiffrements symétriques (beaucoup
plus légers) et, sous une forme allégée, la signature et la vérification de
l'intégrité des données.
Le principe de signature et de
vérification d'intégrité est simplifié par l'emploi préalable d'une fonction de
hachage. Une fonction de hachage calcule le résumé d'un texte. Ce résumé doit
être sens unique, pour éviter de reconstituer le message initial connaissant
seulement le résumé. Il doit être très sensible, c'est à dire qu'une petite
modification du message entraîne une grande modification du résumé. En expédiant un
message accompagné de son résumé (on dit aussi son haché), on peut s'assurer de
l'intégrité du message, en recalculant le résumé l'arrivée.
En associant hachage
et signature, il devient possible d'assurer les fonctionnalités de contrôle
d'intégrité et d'identification de l'expéditeur de faon simple est performante.
La signature devient facile calculer (car le hacher est beaucoup plus court que le
message),et son intégrité, ainsi que celle du message, deviennent
interdépendantes. C'est ce procédé qui sera utilisé dans SSL et TLS, sous le nom de
signature MAC.
Un problème reste cependant : la
fiabilité
du système décrit ci-dessus repose sur la confiance accordée aux clés publiques.
Or
celles-ci doivent elles même se faire connaître des participants une transaction.
Ainsi, toute la sécurité vole en éclat si un tiers malintentionné est capable
de diffuser, l'insu des participants, des clés publiques contrefaites.
Cas
normal
1 - Alice et Bob échangent leur clé publique. Charles peut les lire, il
connaît donc kapublicet kbpublic.
2 - Si Alice veut envoyer un message Bob, elle
chiffre ce message avec kbpublic. Bob le déchiffre avec kbprivate.
3 - Charles, qui ne
possède que kbpublic, ne peut pas lire le message.
Attaque
Admettons
maintenant que Charles soit en mesure de modifier les échanges entre Alice et Bob.
1 - Bob envoie sa clé publique
Alice. Charles l'intercepte et renvoie Alice sa propre clé publique kcpublic en se
faisant passer pour Bob.
2 - Lorsque Alice veut envoyer un message a Bob, elle
utilise donc, sans le savoir, la clé de Charles.
3 - Alice chiffre le message avec
la
clé publique de Charles et l'envoie celui qu'elle croit être Bob.
4 - Charles
intercepte le message, le déchiffre avec sa clé privée kcprivate et peut lire
le message.
5 - Puis il chiffre nouveau le message avec la clé publique de Bob kbpublic, après l'avoir éventuellement modifié.
6 - Bob déchiffre son message avec sa
clé privée et ne se doute de rien puisque cela fonctionne.
Ainsi, Alice et Bob
sont chacun persuadés d'utiliser la clé de l'autre, alors qu'ils utilisent en
réalité tous les deux la clé de Charles.
On peut se prémunir contre cette attaque de diverses faons. Les deux
principales sont la méthode des réseaux de confiance, la méthode de certification par un tiers de confiance. On trouve aussi
des
méthodes d'échange direct (main propre, téléphone) et d'authentification par mot
de passe.
Le principe de la certification par une
autorité repose sur la confiance accordée des organismes centraux. L'entité
souhaitant obtenir une certification s'adresse une autorité,en lui fournissant
sa
clé publique. L'autorité, après avoir vérifié l'identité du demandeur, va fournir
un certificat, auquel il adjoint sa propre signature : celle-ci permet alors de
s'assurer que le certificat a bien été émis par une autorité
compétente.
L'organisme
de certification fait alors office de tiers de confiance. Le protocole retenu pour
la
certification sous SSL et TLS est X.509 v3.
Les certificats racine (c'est dire
émanent
d'autorités hautement ables) sont implémentés directement dans les navigateurs
Web. Le problème l'heure actuel reste surtout l'absence de mise jour des
certificats, en cas de compromission (de la clé privée, par exemple).
Structure d'un certificat X.509
- Version - Numéro
de série - Algorithme de signature du certificat - Signataire du certificat - Validité (dates limite) - Pas
avant - Pas après - Détenteur du certificat - Informations sur la clé publique - Algorithme
de
la clé publique - Clé publique - Identifiant unique du signataire (Facultatif) - Identifiant
unique du détenteur du certificat (Facultatif) - Extensions (Facultatif) - Liste des
extensions...
Le protocole SSL et TLS est subdivisé en quatre sous
protocoles :
Handshake Protocol - Ce protocole négocie les paramètres de cryptage
qui seront l'oeuvre lors de la connexion.
Change Cipher Spec Protocol - Ce protocole
annonce la n du protocole de négociation.
Alarm Protocol - C'est le protocole de
signalement d'erreurs et d'alertes.
Record Protocol - Ce protocole se place entre
les autres et la couche 4. C'est lui qui assure le rôle de communication de SSL
et TLS.
Ils s'organisent comme présenté dans le
schéma suivant :

Commençons par le
protocole de négociation, car c'est le premier utilisé.
Il permet au client et au serveur
de s'authentifier mutuellement, de négocier les algorithmes de chiffrement, de
négocier les algorithmes de MAC (Message Authentification Code) et enfin de négocier les clés symétriques qui vont
servir au chiffrement.
Chaque
message échangé entre le client et le serveur contient trois champs :
Type - indique
l'objet du message (1 octet)
Length - indique la longueur du message (3
octets)
Content - contient les données transmises (plus d'un octet)

1 - Le client envoie un message HELLO_CLIENT, en clair, au serveur. Ce
message contient :
Version - La plus haute version de SSL que puisse utiliser le
client.
Random - Un horodatage de 32 bits et une valeur aléatoire de 28 octets
générée par le client. Le nombre obtenu va servir la signature des
messages.
Session ID - Un nombre, qui
identifie la connexion. Un zéro signifie la volonté du client d'établir une
nouvelle connexion sur une nouvelle session. Un autre nombre signifie la
volonté de changer les paramètres ou de créer une nouvelle connexion sur la
session existante.
CipherSuite - Une liste, par ordre décroissant
de préférence, des algorithmes que supporte le client. Il s'agit des algorithmes
d'échange de clé et de chiffrement.
Compression Method - Liste, par ordre
décroissant
de préférence, des algorithmes de compression supportés par le client.
Puis le
client attend une réponse du serveur
2 - Le serveur répond au client en clair
: HELLO_SERVER. Le message contient :
Version - La plus haute version de SSL que
puisse utiliser le client.
Random - Un horodatage de 32 bits et une valeur aléatoire
de 28 octets générée par le client.
Session ID - L'Identifiant de la session qui
débute.
CipherSuite - La séquence d'algorithmes choisis pour la session. Le serveur
sélectionne la première suite qu'il connait dans la liste transmise par le
client.
Compression Method - La méthode de compression qui va être
utilisée.
Maintenant que les algorithmes sont choisis, le serveur va
s'authentifier
auprès du client. Il envoie pour cela son ou ses certificats (X.509) au client.
Il
peut pendant cette étape demander un certificat au client. Le client vérifie
l'authenticité du serveur : si cette authenticité est mise en doute, la
transaction est interrompue.
3 - Génération des clés de chiffrement symétrique. Le
client génère de son côté une préclé qui servira a produire les clés utilisées
par la suite. Cette clé est envoyée au serveur,cryptée a l'aide de sa clé
publique. A l'aide de cette pré clé, le serveur et le client génèrent quatre clés
pour la session :
Server write mac secret - utilisée dans la signature des
messages du serveur.
Client write mac secret - pour les messages du client.
Server
write key - pour chiffrer les données émises par le serveur.
Client write key - pour
le client.
Ces clés ne sont pas échangées. Si besoin est, le serveur vérifie
l'authenticité du client.
4 - Le client envoie le message CLIENT_FINISHED au
serveur. Ce message est chiffré et signé a l'aide des clés ci-dessus. Cela
signifie
qu' partir de maintenant, le client communique de cette manière.
5 - Le serveur
procède de même. Ces messages sont dénis par le sous protocole Change Cipher Spec
(c'est d'ailleurs tout ce que définit ce protocole).
Ce protocole contient un seul message : change_cipher_spec.
Il est envoyé par les deux parties la n du protocole de négociation. Ce message
transite chiffré par l'algorithme symétrique précédemment négocié.
Ce protocole spécifie les messages d'erreur que peuvent s'envoyer clients et
serveurs. Les messages sont composés de deux octets. Le premier est
soit warning soit fatal. Si le niveau est fatal, la connexion est abandonnée. Les
autres connexions sur la même session ne sont pas coupées mais on ne peut pas en
établir de nouvelles. Le deuxième octet donne le code d'erreur.
Les erreurs
fatales sont :
Unexpected_message - indique que le message n'a pas été
reconnu
Bad_record_mac - signale une signature MAC
incorrecte
Decompression_failure - indique que la fonction de décompression a reçu
une mauvaise entrée
Handshake_failure - impossible de négocier les bons
paramètres
Illegal_parameter - indique un champ mal formaté ou ne correspondant
rien.
Les warnings sont :
Close_notify - annonce la fin d'une
connexion
No_certificate - répond une demande de certificat s'il n'y en a
pas
Bad_certificate - le certificat reçu n'est pas bon (par exemple, sa signature
n'est pas valide)
Unsupported_certificate - le certificat reçu n'est pas
reconnu
Certificate_revoked - certificat révoqué par
l'émetteur
Certificate_expired - certificat expiré
Certificate_unknown - pour tout
problème concernant les certificats et non listé ci-dessus.
Ce protocole chapeaute les autres protocoles de
SSL et TLS, en fournissant
une interface unifiée pour la transmission des données.
Encapsulation - Permet
aux données SSL et TLS d'être transmises et reconnues sous une forme homogène.
Confidentialité - Assure que le contenu du message ne peut
pas être lu par un tiers : les données sont chiffrées en utilisant les clés
produites lors de la négociation.
Intégrité et Identité - Permet de vérifier la
validité des données transmises, grâce aux signatures MAC : cette signature est
elle aussi générée l'aide des clés produites lors de la négociation.
Segmentation - Les données sont découpées en blocs de
taille inférieure 16 384 octets
Compression - Les données sont compressées en utilisant
l'algorithme choisi lors de la négociation. A partir de SSL 3.0, il n'y a plus de
compression.
Signature MAC (0, 16 ou 20 octets) - Une signature des données est
générée l'aide de la clé MAC. Comme elle exploite une fonction de condensation,
on parlera en réalité de HMAC (Hashed MAC). Elle est calculée de la manière
suivante :
|
HASH(
write mac secret
| pad_2
| HASH(
write mac secret
| pad_1
| numéro de ce message
| protocole pour ce message
| longueur de ce message
| données compressées
)
) |
- La fonction de condensation HASH() est soit MD5 soit SHA-1. - Pad_1 et pad_2 sont des mots de remplissage (pad_1 = 0x36 et pad_2 =
0x5C (répétés 40 fois pour SHA-1 et 48 fois pour MD5))
Chiffrement - Le paquet obtenu est
chiffré l'aide
de
la fonction dénie lors de la négociation et de la write key. Les algorithmes
actuellement possibles pour le chiffrement sont 3-DES 168, IDEA 128, RC4
128, Fortezza 80, DES 56, DES-40, RC4-40, RC2-40.
Ajout de l'en tête (5
octets) - L'entête SSL est ajoutée et le paquet est passé à la couche inférieure. Il
contient :
Content-Type (1 octet) - Indique le type de paquet
SSL et TLS contenu dans
l'enregistrement :
0x20
- Paquet de type Change Cipher Spec 0x21
- Paquet de type Alert 0x22
- Paquet de type Handshake 0x23
- Paquet de type Application Data : ce type
correspond aux données effectives de la transaction SSL.
Major Version (1 octet), Minor Version (1 octet) - Numéros de versions principal et secondaire du protocole
SSL et TLS utilisé. Par exemple, le protocole TLS1.0 sera identifié avec la paire
(0x03,0x01), car TLS 1.0 est considéré comme la version 3.1 de SSL.
(Compressed)
Length (2 octets) - Taille (compressée s'il y a lieu) du fragment SSL et TLS.
A la réception des paquets,
le destinataire effectue les opérations suivantes :
1
- Vérification de l'entête SSL 2 - Déchirage du paquet 3 - Vérification du champ HMAC (en appliquant la même
fonction que ci-dessus aux données déchiffrées puis en comparant le résultat au
HMAC reçu) 4 - Décompression des données 5 - Réassemblage des parties
Si au cours de
ces vérifications se passe mal, une alarme est générée.
Les navigateurs n'ont
pas de fonctionnalités évoluées de gestion des clés : les certificats ne peuvent
par exemple pas être automatiquement renouvelés et l'historique des clés
n'est pas conservé. Quand un certificat expire, l'utilisateur reçoit un message et
doit obtenir manuellement un nouveau certificat, ce qui n'est pas forcément
trivial
pour un utilisateur lambda.
La relation de confiance est dénie par la liste
pré installée des autorités de certification :Les navigateurs du commerce sont
livrés avec de nombreuses clés publiques pré installées (Netscape en contient
33). Celles-ci sont utilisées pour la vérification de la signature de l'autorité de
certification pour les certificats d'autres navigateurs ou serveurs. Pour
être confirmé, un certificat doit être signé par n'importe laquelle des AC
présentes
dans le navigateur. Par conséquent, si l'une quelconque parmi les autorités de
certification certifie un site frauduleux, ce certificat sera vérifié correctement
par
des millions de navigateurs.
Ce problème prend toute son ampleur quand il s'agit
de certificats révoqués. En effet, le protocole SSL et TLS (1.0) ne prévoit pas
l'obtention de la liste des certificats révoqués (CRL, Certificates Revoked List) par l'autorité de
certification avant d'utiliser un certificat (ou périodiquement). Un certificat
ainsi
signé par une autorité peut être révoqué (utilisation frauduleuse du certificat,
clé divulguée...) sans que l'utilisateur n'en soit informé.
On peut alors imaginer
l'attaque suivante :
Un utilisateur
malintentionné peut créer un site portant un nom similaire un autre, connu, par
exemple www.goggle.com. Cet utilisateur obtient alors un certificat pour son site
et peut ainsi piéger d'autres utilisateurs par fishing, ou autre. Dans ce cas,
même si l'autorité révoque le certificat, le site pirate continuera d'être perçu
comme sûr par les navigateurs internet.
Les caractéristiques de SSL sont donc :
- L'indépendance vis à
vis des couches inférieures et supérieures - Le fonctionnement en mode
Client/Serveur - L'assurance aux deux parties d'une transaction authentifiée
(certificats), privée (cryptage) identifiée et intègre (MAC).
L'âge de SSL lui
confère une maturité certaine et d'une longue expérience. Malgré ses défaillances
au niveau de l'authentification, son utilisation est très répandue et cela
prouve sa robustesse. Son évolutivité, ainsi que son évolution lui promettent un
bel avenir.
Vous pouvez poser toutes vos questions,
vos remarques et vos expériences à propos de SSL et TLS. Pour cela,
rendez vous sur le Forum
Sécurité.
Version 1.1, le 23 décembre 2006, par
par Vincent LIMORTE, François VERRY et Sébastien FONTAINE, création du document.
|