Du nouveau chez TLS

Présentation rapide de TLS/SSL

Vous connaissez probablement tous les protocoles TLS et SSL, pour rappel SSL (Secure Socket Layer) est une norme inventé par Netscape il y a quelques temps déjà, qui fut standardisé par l'IETF en décembre 1999 sous le nom TLS (Transport Layer Security) par la RFC 2246, en version 1.0. Je propose dans cet article de découvrir une évolution très pratique de TLS.

La problématique de TLSv1.0 RFC2246

Comme vous le savez probablement tous, dans le cas d'une connexion TLS (typiquement une session HTTPs), l'établissement de la session s'effectue avant tout échange au niveau applicatif. Concrêtement, il est donc impossible de faire des hôtes virtuels, sur une même adresse IP, avec plusieurs certificats. En effet, dans le cas d'une session HTTPs, le nom d'hôte demandé (défini par l'en-tête Host:) est envoyé au serveur HTTP après l'établissement de la session SSL/TLS, donc après la négociation des certificats. Il est cependant possible d'utiliser le même certificat pour plusieurs hôtes virtuels en utilisant l'extension subjectAltName des certificats X509v3, mais point de salut en cas de multiples certificats.

L'évolution de TLSv1.0 : RFC 3546

Conscient du problème évoqué ci dessus, l'IETF à travaillé sur une évolution de la RFC 2246, tout en restant en version 1.0 du protocole. Une des évolutions notables est l'introduction du concept de SNI (Service Name Indication), décris dans le chapitre 3.1 de la RFC 3546, en voici un extrait :


[TLS] does not provide a mechanism for a client to tell a server the
name of the server it is contacting. It may be desirable for clients
to provide this information to facilitate secure connections to
servers that host multiple 'virtual' servers at a single underlying
network address.


In order to provide the server name, clients MAY include an extension
of type "server_name" in the (extended) client hello. The
"extension_data" field of this extension SHALL contain
"ServerNameList" where: [..]

Qu'est ce que cela veut dire ? Tout simplement que les clients (par exemple un navigateur web) peut désormais préciser le nom du service demandé avant la négociation SSL, de la même façon que l'en tête Host: en HTTP. Permettant ainsi aux applications d'agir de manière différente en fonction du SNI.

Pour résumer, l'extension SNI permet (du moins quand elle sera implémentée dans l'ensemble des navigateurs et des bibliothèques de sécurités telles qu'OpenSSL et GNU TLS) de faire des vrais hôtes virtuels basés sur le nom, sur une seule adresse IP, avec des certificats différents.

Références

Remerciements

  • KingBug pour tout ses liens