TUTORIELS 
SSL en Java avec JSSE
L'API JSSE permet de manipuler en Java des sockets sécurisés répondant aux spécifications SSL. Présentation.  (21 août 2001)
 

La question du cryptage de données envoyées via Internet est plus large et plus complexe qu'il n'y paraît. Il ne s'agit pas seulement de sélectionner un algorithme efficace, il est de plus nécessaire de sécuriser, notamment, le protocole de transmission des données, ou encore le système d'identification et notamment les mots de passe.

L'ensemble des mesures de sécurité nécessaires est assuré par un ensemble de spécifications constituant SSL (Secure Sockets Layer), dont l'implémentation en Java est le "package" JSSE (Java Secure Socket Extension) en liaison avec le JRE (Java Run-Time Environment). Ce "package" contient les outils permettant de faire communiquer un serveur HTTPS (serveur sécurisé par SSL) avec une application cliente en Java.

SSL (aujourd'hui en version 3.0) permet d'utiliser des sockets (ports) sécurisés en manipulant des clés publiques pour l'autentification et des clés privées pour le cryptage. L'API JSSE fournit les classes permettant de programmer tout ceci en Java: on les trouve dans javax.net, javax.net.ssl et javax.security.cert.

Les principales classes sur lesquelles nous allons nous pencher sont les suivantes:

SSLSocket
SSLServerSocket
SocketFactory
ServerSocketFactory
SSLSocketFactory
SSLServerSocketFactory

La première supporte les méthodes de la classe java.net.Socket.class pour la manipulation des sockets, en ajoutant des méthodes spécifiques aux sockets sécurisés. La seconde permet de créer des instances de server sockets par le biais de la méthode createSocket().

La classe SocketFactory est une classe abstraite, implémentée par la classe SSLSocketFactory. La classe SSLServerSocketFactory implémente de même la classe abstraite ServerSocketFactory. La méthode getDefault() de SSLServerSocketFactory permet d'obtenir une instance de la classe.

L'utilisation de classes du type "Factory" permet d'instancier des objets dont on ne connaît pas à l'avance la sous-classe à utiliser pour l'instanciation. La classe "Factory" va permettre de le décider à l'exécution. Ainsi la classe SSLServerSocketFactory va instancier une sous-classe de SSLServerSocket, correspondant aux besoins. Le choix est fait en fonction du système: il s'agit donc d'encapsuler tout ce qui n'appartient pas à l'environnement Java.

Côté serveur, on écrira donc quelque chose comme:

SSLServerSocketFactory sf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket s =   (SSLServerSocket)sf.createServerSocket(
port);
SSLSocket in = (SSLSocket)s.accept();


et côté client:

SSLSocketFactory sf =(SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket s = (SSLSocket)sf.createSocket(
host, port);

L'authentification est réalisée au moyen d'une paire de clés (une clé publique/une clé privée) et d'un certificat. On peut créer ces clés et un certificat auto-signé au moyen de keytool, un utilitaire disponible avec JDK 1.4:

keytool -genkey -v -keyalg RSA -keystore keystore

et en saisissant un certain nombre d'informations, dont le mot de passe "keystore". Ici est utilisé l'algorithme RSA.

On invoquera ensuite le client Java permettant la communication avec le serveur HTTPS de la manière suivante:

java -Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword="motdepasse" nomClient

Pour compléter cette très brève introduction, les sites suivants (tous en anglais) peuvent être consultés avec profit:
http://www.ddj.com/articles/2001/0102/0102a/0102a.htm?topic=security
http://www.javaworld.com/javaworld/jw-05-2001/jw-0511-howto.html
http://www.onjava.com/pub/a/onjava/2001/05/03/java_security.html?page=1
http://www.cs.columbia.edu/~akonstan/netcallback/

 
[ Jérôme MorlonJDNet
 
Accueil | Haut de page