vendredi 27 juin 2008

Sécuriser un service Axis2 avec des certificats

Pour sécuriser un service par une authentification basé sur certificat.


Il faut d'abord créer les magasin de clés pour le serveur et le client. Ces clés serviront pour authentifier les partis.

Ensuite, le serveur fournit un certificat pour le client, il faut considérer ce certificat comme une autorisation de se connecter au serveur (C'est pour cette raison qu'elle doit provenir du serveur). Ensuite, le client l'importe dans son magasin. Ces commandes se passent à laide de keytool.


keytool -genkey -alias serverkey -keystore keystoreserver.jks
keytool -genkey -alias clientkey -keystore keystoreclient.jks
keytool -selfcert -alias serverkey -keystore keystoreserver.jks
keytool -export -alias serverkey -keystore keystoreserver.jks>moncertif
keytool -printcert -file moncertif
keytool -import -keystore keystoreclient.jks -file moncertif


Il ne reste plus qu'à configurer axis2. Copier d'abord, le magasin de clé (keystore du serveur dans le répertoire classes/ de Axis2). Puis, dans le fichier conf/axis2.xml. Modifier les receiver et sender. Dans notre configuration le truststore est confondu avec le keystore. Si le besoin existait de les séparer le truststore doit contenir le certificat importé et le keystore, la clé de signature du serveur.


  <transportReceiver name="https" class="org.apache.axis2.transport.nhttp.HttpCoreNIOSSLListener">
<parameter name="port" locked="false">9002</parameter>
<parameter name="non-blocking" locked="false">true</parameter>
<parameter name="keystore" locked="false">
<KeyStore>
<Location>keystoreserver.jks</Location>
<Type>JKS</Type>
<Password>axis2rules</Password>
<KeyPassword>axis2rules</KeyPassword>
</KeyStore>
</parameter>
<!--parameter name="truststore" locked="false">
<TrustStore>
<Location>keystoreserver.jks</Location>
<Type>JKS</Type>
<Password>axis2rules</Password>
</TrustStore>
</parameter-->
<!--<parameter name="SSLVerifyClient">require</parameter>
supports optional|require or defaults to none -->
</transportReceiver>



    <transportSender name="https" class="org.apache.axis2.transport.nhttp.HttpCoreNIOSSLSender">
<parameter name="non-blocking" locked="false">true</parameter>
<parameter name="keystore" locked="false">
<KeyStore>
<Location>keystoreserver.jks</Location>
<Type>JKS</Type>
<Password>axis2rules</Password>
<KeyPassword>axis2rules</KeyPassword>
</KeyStore>
</parameter>
<parameter name="truststore" locked="false">
<TrustStore>
<Location>keystoreserver.jks</Location>
<Type>JKS</Type>
<Password>axis2rules</Password>
</TrustStore>
</parameter>
<!--<parameter name="HostnameVerifier">DefaultAndLocalhost</parameter>
supports Strict|AllowAll|DefaultAndLocalhost or the default if none specified -->
</transportSender>



Enfin, il faut en fait rajouter deux lignes dans le code client :

System.setProperty("javax.net.ssl.trustStore", "chemin au clientTruststore");
System.setProperty("javax.net.ssl.trustStorePassword", "mot de passe du clientTruststore");

4 commentaires:

Test a dit…

Le transportReceiver et le transportSender, tu les mets dans le config server ou dans la config client ?

Clement Soullard a dit…

C'est dans la config du serveur tomcat.

Test a dit…

Et comment ferais-tu s'il faut faire une SSL 2-ways? Pour que le client envoie son certificat ?

totof a dit…

Merci pour ce tutoriel sur AXIS2. J'ai tenter de reproduire l'exemple de ce tutoriel mais cela ne fonctionne pas.
J'utilise axis 1.5, j'ai ajouté le "transportReceiver" et le "transportSender" dans le fichier conf/axis2.xml ainsi que les jks dans le répertoire classes d'axis2.
Lorsque je consulte les services d'axis au travers d'un navigateur web, j'obtiens le message "Internal Server Error".
Il y a-t-il des modifications spécifique à tomcat ou autres?