Libellés

dimanche 6 février 2011

Serveur REST avec JAXRS + Basic Auth + SSL avec Restlet

J'avais un peu galéré pour mettre en place un serveur webservice REST avec authentification basic et chiffrement  SSL en java.

L'authentification basic transmettant le login et le mot de passe en clair, il est indispensable de l'utiliser via une connexion chiffré (HTTPS).

JAX-RS est l'un des standard pour faire des web-services JAVA :

  • JAX-RS = JSR311 pour les webservices REST
  • JAX-WS = JSR 224 pour les webservices SOAP

En dehors des standards il existe un certain nombre de frameworks pour faire des web-services REST en JAVA :



A l'époque j'était parti sur une base CXF, mais la documentation n'étais pas très abondante.

Ensuite j'ai migré sur Restlet. La solution n'a pas été très évidente à trouver, mais ça marche.

Voici la solution (pour les plus pressés):
https://github.com/Filirom1/JAX-RS-Server/blob/master/src/main/java/org/filirom1/jaxrs/JAXRSServer.java


Maintenant, si vous ne voulez pas vous prendre la tête, voici une API plus simple d'utilisation :
JAXRSServer server = new JAXRSServer(MyResource.class, 8443);
server.enableBasicAuthentication("Realm", "login", "password");
server.enableSSL("www.hostname.fr", new File("path-to-your-keystore.jks"), "keyStorePassword", "keyPassword");
try {
    server.start();

    /* do what you have to do */

    server.stop();
} catch (Exception ex) {
    Assert.fail("Unable to start", ex);
}

Et voici un exemple de Resource JAX-RS qui affiche un hello world :
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("/")
class MyRessource{

    @GET
    @Produces("text/plain")
    public String getPlain() {
        return "Hello world)";
   

Et pour les utilisateurs de maven, voila comment inclure cet API dans votre pom.xml :
<dependencies>
...
    <dependency>
        <groupId>org.filirom1</groupId>
        <artifactId>JAX-RS-Server</artifactId>
        <version>1.0.0</version>
        <type>jar</type>
    </dependency>
...
</dependencies>
<repositories>
    <repository>
        <id>filirom1-repo</id>
        <url>https://Filirom1@github.com/Filirom1/filirom1-mvn-repo/raw/master/releases</url>
    </repository>
    <repository>
        <id>maven-restlet</id>
        <url>http://maven.restlet.org</url>
    </repository>
</repositories>
https://github.com/Filirom1/JAX-RS-Server

Juste pour le fun, j'utilise Resty comme client Webservice REST.
Il est simple d'utilisation et léger (0 dépendance externe).

Voici un exemple pour faire un GET avec authentification basic :
Resty r = new Resty();
r.authenticate("https://localhost:8443", "login", "password".toCharArray());
String resp = r.text("https://localhost:8443").toString();


Si vous avez des problèmes avec votre client REST avec les certificats auto-signés, je vous conseil le code de Francis Labrie :
  • SSLUtilities.trustAllHostnames() pour désactiver la vérification du hostname pour les connexion HTTPS
  • SSLUtilities.trustAllHttpsCertificates() pour désactiver la vérification du certificat pour les connexions HTTPS


Et si vous ne savez encore comment générer un certificat auto-signé :
# Generate a Self-Signed Certificate #
keytool -genkey -v -alias localhost -dname "CN=localhost, OU=IT, O=MyCompany, L=Lyon, ST=France, C=FR" -keypass password -keystore localhost.jks -storepass password -keysize 1024;

# Export your certificate in order to import it in your trustore
keytool -storepass password -alias localhost -export -file localhost.cer -keystore localhost.jks

# Import your certificate into the default JAVA truststore.
sudo keytool -keystore /etc/java-6-sun/security/cacerts -storepass changeit -import -trustcacerts -v -alias localhost -file localhost.cer



Ou sinon, on peut également générer des certificats auto-signés avec maven (très pratique pour les tests) :
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>keytool-maven-plugin</artifactId> <executions> <execution> <phase>generate-resources</phase> <id>clean</id> <goals> <goal>clean</goal> </goals> </execution> <execution> <phase>generate-resources</phase> <id>genkey</id> <goals> <goal>genkey</goal> </goals> </execution> </executions> <configuration> <keystore>${project.build.directory}/localhost.jks</keystore> <dname>CN=localhost, OU=IT, O=MyCompany, L=Lyon, ST=France, C=FR</dname> <keypass>password</keypass> <storepass>password</storepass> <alias>localhost</alias> <keyalg>RSA</keyalg> </configuration> </plugin>




Aucun commentaire:

Enregistrer un commentaire