Affichage des articles dont le libellé est axis2. Afficher tous les articles
Affichage des articles dont le libellé est axis2. Afficher tous les articles

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");

Pourquoi utiliser Spring dans un Web Service ?

Spring est un framework d'injection, et pour comprendre son intérêt il faut comprendre ce mécanisme et son intérêt.

L'injection est l'affectation d'une propriété par une sorte de container light(C'est le rôle de Spring). Dans le cadre d'une application simple (C'est à dire standalone) l'injection s'identifie simplement à une forme d'utilisation de pattern singleton.

On se sert de l'injection pour principalement deux cas de figure :

- Configurer et dimensionner par un bean de Configuration.
- Contrôler strictement ses instanciations pour pouvoir dimensionner précisément (Utiliser une seule instance DAO pour l'ensemble de ses instance de service par exemple).

Dans le cadre général des serveurs d'application, la notion d'injection est plus complexe. Il faut avant tout de comprendre qu'elle est liée au classloader et qu'il se pose des problème de scope. Ainsi, ce n'est pas parce qu'on injecte une propriété dans l'application, que cette propriété est injectée dans l'ensemble des instances de services.

Dans le cas des Web-Service, l'utilisation de Spring n'est donc pas triviale. Pour faire court, sil vous utiliser Axis et que vous souhaiter utiliser Spring dans axis, c'est un peu comme de vouloir utiliser deux moteur de Web-Service en un.

Même si cela reste possible, dans la majeur partie des cas il vaut mieux : soit se servir de httpinvoker (inclus dans spring).
Ou bien, si la fonction de container de Web-Service est fondamentale, ne se servir que du conteneur et ne pas utiliser Spring, cela est vrai pour : Axis, Axis2 etc.

mardi 17 juin 2008

Débuter avec axis2

Installer Axis2 sous Linux

  • Télécharger Axis2
  • Extraire le jar dans /usr/axis2-1.4
  • Effectuer des liens ln -s /usr/axis2-1.4/bin/wsdl2java.sh /usr/bin/wsdl2java.sh
  • Effectuer des liens ln -s /usr/axis2-1.4/bin/axis2.sh /usr/bin/axis2.sh
  • Modifier la première ligne dir=/usr/axis2-1.4/bin/ avec le chemin d'installation réel dans /usr/axis2-1.4/bin/axis2.sh et /usr/axis2-1.4/bin/wsdl2java.sh
  • Télécharger ANT
  • Extraire le jar dans /usr/apache-ant-xxx
  • Effectuer des liens ln -s /usr/apache-ant-xxx/bin/ant /usr/bin/
  • Exporter la variable export AXIS2_HOME=/usr/axis2-1.4



Supprimer le SOAP12 sur axis2
Modifier le fichier axis2.xml
   <parameter name="disableSOAP12" locked="true">true</parameter>


Utiliser avec Hibernate 3.6.2

Il faut utiliser antlr-1.7.7 et faire ettention au classpath d'une manière générale.
(Le classloader de l'application axis ne permet pas de redescendre plus bas au scope service s'il utilise le scope application.)
Concrètement cela signifie qu'il est impossible de mettre le fichier hibernate dans les librairies de AXIS.
Effectuer une première génération

  • Créer un répertoire pour votre projet
  • wsdl2java.sh -uri http://urlduwebservice.com/monservice
  • Taper ant

Structure d'une archive AXIS2
On peut déployer un service axis sous forme d'un fichier aar.

META-INF/services.xml
lib/*.jar



Il est également possible de le déployer sous forme d'un répertore ayant la même structure.

Note pour se servir du mapping adb à partir de POJO.

Si le bean retourné contient une liste d'élément, il n'est pas possible de se servir des typecast de liste, il faut se servir de tableau.

Génerer un Web Service à partir d'un WSDL et de Maven

Ajouter le bloc

<build>
<plugins>
<plugin>
<groupId>org.apache.axis2.maven2</groupId>
<artifactId>axis2-wsdl2code-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>wsdl2code</goal>
</goals>
<configuration>
<package>com.foo.myservice</package>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>




mvn -U axis2-wsdl2code:wsdl2code -DwsdlFile=http://10.202.48.12:8080/axis2/services/OrganisationControleService?wsdl -Daxis2.wsdl2code.package=joe.bigood


Il faut rajouter manuellement et en local la dépendance au plugin.

<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>