Skip to Main Content

Java APIs

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

RMI over SSL, Error while handshaking.

814824Nov 24 2010 — edited Nov 28 2010
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.
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Dec 26 2010
Added on Nov 24 2010
14 comments
2,937 views