IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

Application RMI avec SSL


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Application RMI avec SSL
    Bonjour à tous,

    Je me suis mis depuis peu à m'intéresser au package java.rmi

    je souhaiterai faire communiquer un serveur et un/plusieurs client(s). Le tout me permettrai d'envoyer pour le moment une chaine de caractère.

    Si je le fait sans passer par SSL, cela fonctionne très bien (du moins ça en à l'air ^^)

    maintenant si je suis ici c'est qu'avec SSL cela pose problème.

    Mon problème est que je génère sur mon client une exception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    Si je ne me trompe pas, cela signifie que le client et le server n'ont en gros, pas réussie a trouver un compromis pour échanger les donnée de manière sécurisé qui leurs conviennent.

    Cela doit donc venir du certificat utilisé non ?

    avant de continuer voici un peu de code

    InterfaceServeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    import java.rmi.*;
    public interface ServeurInterface extends Remote {
    public void ecrirePassword(String password) throws RemoteException;
    }
    Classe Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    import java.net.MalformedURLException;
    import java.rmi.Naming;
    import java.rmi.RMISecurityManager;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
     
    import javax.rmi.ssl.SslRMIClientSocketFactory;
    import javax.rmi.ssl.SslRMIServerSocketFactory;
     
     
    public class Serveur extends UnicastRemoteObject implements ServeurInterface{
     
    	/**
             * 
             */
    	private static final long serialVersionUID = -1217529625177961947L;
    	public static int port;
    	public static SslRMIClientSocketFactory csf;
    	public static SslRMIServerSocketFactory ssf;
     
    	public Serveur() throws RemoteException {}
     
    	public Serveur(int port, SslRMIClientSocketFactory csf, SslRMIServerSocketFactory ssf) throws RemoteException{
    		super(port,csf,ssf);
     
    	}
     
    	public void ecrirePassword(String password) throws RemoteException {
    		System.out.println("le password est (Serveur) : "+ password);		
    	}
     
    	public static void main(String args[])
    	{
     
    		try
    		{
    			//set the security manager
    			System.setSecurityManager(new RMISecurityManager());
     
    			//Serveur server = new Serveur();
    			port = 443;
    			csf = new SslRMIClientSocketFactory();
    			ssf = new SslRMIServerSocketFactory();
     
    			Serveur server = new Serveur(port,csf,ssf);
    			Naming.rebind("//mon-ip:1099/Serveur" , server);
    			System.out.println("Server waiting on .....");
    		}
    		catch (RemoteException re)
    		{
    			System.out.println("Remote exception: " + re.toString());
    		} catch (MalformedURLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
     
    }
    Classe Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    import java.rmi.Naming;
    import java.rmi.RMISecurityManager;
    import java.rmi.RemoteException;
     
     
    public class Client {
     
    	public Client() {}
     
    	public static void main(String[] args)
    	{
     
    		//set the security manager for the client
    		System.setSecurityManager(new RMISecurityManager());
    		//get the remote object from the registry
    		try
    		{
    			System.out.println("Security Manager loaded");
    			String url = "//mon-ip:1099/Serveur";
    			ServeurInterface _server = (ServeurInterface)Naming.lookup(url);
    			System.out.println("Atteindre l'objet Remote");
     
    			Tools t = new Tools();
    			String password = t.generatePassword(10);
    			System.out.println("test: ");
    			_server.ecrirePassword(password);
    			System.out.println("Insertion faite");
    			System.out.println("Le password est : "+password);
    		}
    		catch (RemoteException exc)
    		{
    			System.out.println("Error in lookup: " + exc.toString());
    			exc.printStackTrace();
    		}
    		catch (java.net.MalformedURLException exc)
    		{
    			System.out.println("Malformed URL: " + exc.toString());
    		}
    		catch (java.rmi.NotBoundException exc)
    		{
    			System.out.println("NotBound: " + exc.toString());
    		}
    		catch (Exception exc)
    		{
    			System.out.println("NotBound: " + exc.toString());
    		}
    	}
    }
    Je compile le tout puis en ligne de commande je fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //permet d'obtenir mon stub
    rmic Serveur
     
    //puis je lance le registre
    rmiregistry
    de plus j'ai un fichier policy de ce type pour accepter les connections
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    grant {
    	permission java.net.SocketPermission "*:1024-65535", "accept, connect";
    	permission java.net.SocketPermission "*:80", "connect";
    	permission java.security.AllPermission "", "";
    };
    ensuite je lance mon serveur, puis mon client sans autre paramètre pour le moment.(le tout sur la même machine)

    et la j'obtiens une levé d'exception au lancement du client :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    	javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    	at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    	at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    	at Serveur_Stub.ecrirePassword(Unknown Source)
    	at Client.main(Client.java:26)
    Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
    	at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
    	at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    	at java.io.BufferedOutputStream.flush(Unknown Source)
    	at java.io.DataOutputStream.flush(Unknown Source)
    	... 5 more
    j'ai tenté par la suite de créer un fichier keystore a l'aide de keytool :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    keytool -genkey -keystore myks -keyalg RSA
    puis rajouter en paramètre au lancement de mon Serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -Djavax.net.ssl.keyStore=myks -Djava.net.ssl.keyStorePassword=password
    puis rajouter en paramètre au lancement de mon Client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -Djavax.net.ssl.trustStore=myks -Djava.net.ssl.trsutStorePassword=password
    mais cela me génère la même exception

    De plus il me semblais que génère un certificat ssl avec keytool ne me servait pas en utilisant les classes "SslRMIClientSocketFactory" et "SslRMIServerSocketFactory" qui selons moi devaient se débrouiller toute seul avec les parametre par defaut ? (cf leur documentation respective)

    SslRMIClientSocketFactory
    SslRMIServerSocketFactory


    Enfin voila, merci à ceux qui ont pris le temps de lire ce long post jusqu'au bout, j'ai déjà fait plusieurs recherches à ce sujet mais aucune des solution n'a résolu mon problème.

    Quoi que je fasse, je me retrouve toujours avec la même levé d'exception. Du coup par SSL plus rien ne fonctionne.

    ps : lorsque le code fonctionnait j'utilise le constructeur sans paramètre.

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut
    je passe le sujet en résolu, même si sa me laisse un peu sur ma faim

    voila la solution trouvé pour le moment qui a l'air de fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       1.  Create a self-signed server and a self-signed client key each in its own keystore
     
          keytool -genkey -v -keyalg RSA -keystore server.keystore -dname "CN=Server, OU=Bar, O=Foo, L=Some, ST=Where, C=UN"
     
          keytool -genkey -v -keyalg RSA -keystore client.keystore -dname "CN=Client, OU=Bar, O=Foo, L=Some, ST=Where, C=UN"
     
       2. Export the server's and the client's public keys from their respective keystores
     
          keytool -export -rfc -keystore server.keystore -alias mykey -file server.public-key
     
          keytool -export -rfc -keystore client.keystore -alias mykey -file client.public-key
     
       3. Import the client's public key to the server's keystore, and vice-versa:
     
          keytool -import -alias client -keystore server.keystore -file client.public-key
     
          keytool -import -alias server -keystore client.keystore -file server.public-key
    puis de lancer le serveur puis le client de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    java -Djavax.net.ssl.trustStore=server.keystore -Djavax.net.ssl.keyStore=server.keystore  -Djavax.net.ssl.keyStorePassword=passServer
     
    puis 
     
    java -Djavax.net.ssl.trustStore=client.keystore -Djavax.net.ssl.keyStore=client.keystore  -Djavax.net.ssl.keyStorePassword=passClient

    source

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter une application Java RMI avec l'invite de commande
    Par lollita2321 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 03/05/2011, 14h13
  2. Application RMI avec eclipse
    Par arnaudkenf dans le forum Eclipse Java
    Réponses: 0
    Dernier message: 26/08/2009, 22h32
  3. une application qui envoie un émail avec SSL
    Par tomy_libre dans le forum Débuter
    Réponses: 1
    Dernier message: 19/07/2009, 01h06
  4. Réponses: 2
    Dernier message: 26/05/2003, 19h42
  5. [Kylix] application console avec kylix 3 ?
    Par Hakim dans le forum EDI
    Réponses: 4
    Dernier message: 15/11/2002, 22h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo