Hi, i've tried to implement RMI over SSL using SslRMIClientSocketFactory and SslRMIServerSocketFactory, I've already create and put the Keystore and the Truststore, but still I have error when trying to execute the client:
MessageClient exception:
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:286)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:110)
at MessageServer_Stub.connect(Unknown Source)
at MessageClient.main(MessageClient.java:29)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632)
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:211)
... 4 more
MY SERVER CODE
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.*;
import java.rmi.*;
import javax.rmi.ssl.*;
public class MessageServer implements Message{
public static void main(String args[]){
try{
Message server = new MessageServer();
//Message stub = (Message) UnicastRemoteObject.exportObject(server, 0);
Message stub = (Message) UnicastRemoteObject.exportObject(server, 0,
new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
Registry registry = LocateRegistry.getRegistry();
//Registry registry = LocateRegistry.createRegistry(0, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
registry.rebind("Mensaje", stub);
System.setProperty("javax.net.ssl.keyStore", "./Server_Keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "prueba");
System.out.println("MensajeCall bound");
}
catch (Exception error){
System.err.println("MessageServer exception:");
error.printStackTrace();
}
}
public void connect(MessageC c){
try {
System.out.println("Client " + c.getName() + " connected.");
c.connected();
}
catch (RemoteException re) {
System.out.println("Remote Exception: " + re.getMessage());
}
}
public void disconnect(MessageC c){
try {
System.out.println("Client " + c.getName() + " disconnected.");
c.disconnected();
}
catch (RemoteException re) {
System.out.println("Remote Exception: " + re.getMessage());
}
}
}
MY CLIENT CODE:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.io.Serializable;
import java.rmi.*;
import java.rmi.server.*;
import javax.rmi.ssl.SslRMIClientSocketFactory;
public class MessageClient implements MessageC, Serializable{
String clientName;
public MessageClient(){
clientName = "Objeto!";
}
public String getName(){
return clientName;
}
public static void main(String args[]) {
String name = "Mensaje";
try {
MessageClient mc = new MessageClient();
UnicastRemoteObject.exportObject(mc);
//Registry registry = LocateRegistry.getRegistry("localhost", 0);
Registry registry = LocateRegistry.getRegistry("localhost", 0, new RMISSLClientSocketFactory());
Message comp = (Message) registry.lookup(name);
System.setProperty("javax.net.ssl.trustStore", "./Client_Truststore");
comp.connect(mc);
comp.disconnect(mc);
} catch (Exception e) {
System.err.println("MessageClient exception:");
e.printStackTrace();
}
}
public void connected(){
System.out.println("Connection established.");
}
public void disconnected(){
System.out.println("Connection ended.");
}
}
Some advise what am I doing wrong? For the record, this RMI program use callbacks from server to client.
Hope someone can tell me where am I wrong or what can I do.