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/
|