[RMI sur couche SSL] -> handshake_failure !
Salut à tous,
Je suis en train de développer un petit client/serveur en RMI, qui communiquent entre eux sur une couche SSL. Je travaille en java 1.4.2.
Mon serveur :
Code:
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
| package rmissl;
import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.rmi.ssl.SslRMIServerSocketFactory;
import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;
import javax.net.ssl.*;
import java.security.*;
import java.io.*;
public class HelloServer extends UnicastRemoteObject implements HelloInterface
{
//------------------
// Donnees
//------------------
public static final long serialVersionUID = 000;
public static RMIClientSocketFactory csf = null;
public static RMIServerSocketFactory ssf = null;
//------------------
// Methodes de Hello
//------------------
public HelloServer() throws RemoteException
{
super(0, csf, ssf);
}
public void message() throws RemoteException
{
System.out.println("Chboum");
}
//------------------
// Methode main()
//------------------
public static void main(String[] args)
{
System.setSecurityManager(new RMISecurityManager());
System.out.println("Hello world !");
try
{
HelloInterface obj = new HelloServer();
csf = new SslRMIClientSocketFactory();
ssf = new SslRMIServerSocketFactory();
Registry reg = LocateRegistry.createRegistry(2004, csf, ssf);
reg.rebind("msg", obj);
System.out.println("Server complete.");
}
catch (Exception e)
{
e.printStackTrace();
}
}
} |
Et mon client :
Code:
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
| package rmissl;
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.rmi.ssl.SslRMIServerSocketFactory;
public class Client
{
public static void main(String[] args)
{
try
{
System.out.println("Preparation client...");
System.setSecurityManager(new RMISecurityManager());
Registry reg = LocateRegistry.getRegistry("lat203", 2004, new SslRMIClientSocketFactory());
System.out.println("Get registry ok.");
Object obj = reg.lookup("msg"); // <- ICI L'EXCEPTION
System.out.println("Execution de la routine message.");
((HelloInterface)obj).message();
System.out.println("Execution client ok.");
}
catch(Exception e)
{
e.printStackTrace();
}
}
} |
Là, mon serveur se lance sans problème. À l'exécution du client, voici l'exception que je récupère :
Citation:
Preparation client...
Get registry ok.
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(TCPChannel.java:273)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:171)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:306)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at rmissl.Client.main(Client.java:19)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:117)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1584)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:866)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1030)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:622)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at java.io.DataOutputStream.flush(DataOutputStream.java:106)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
... 4 more
Quelqu'un aurait une idée de ce qui se trame là-dessous ?
Merci d'avance.