# RMI + SSL -> RemoteException



## Gerinald (17. Apr 2007)

Hallo,

ich habe ein kleines RMI Projekt, das ich gerne auf RMI+SSL umstellen möchte. Dazu habe ich mir im Netz einige Tutorials durchgelesen und versucht, das ganze nachzubauen.

Leider erhalte ich grundsätzlich eine RemoteException, wenn der Client versucht, das lookup auszuführen.

Hier meine Quelltexte:

Der Server: Soll eigentlich nur einen String "verarbeiten"

```
public class SSLServer extends UnicastRemoteObject implements SSLServerInterface {
	private static final long serialVersionUID = 1L;
	
	public SSLServer() throws RemoteException {
		super(Registry.REGISTRY_PORT+1,
				new SslRMIClientSocketFactory(), 
				new SslRMIServerSocketFactory());
		//super();
	}
	
	public String getMessage(String s) throws RemoteException {
		return s + " bar";
	}
}
```

Der serverStarter: Legt die Registry und den SecurityManager an und startet den Server

```
public class serverStarter {
	public static void main(String[] args) {
		SSLServer sslServer = null;
		Registry sslRegistry = null;
		try {
			sslServer = new SSLServer();
		} catch(RemoteException e) {
			System.out.println("Error: Cannot create SSLServer: RemoteException.");
		}
		System.out.println("Success: SSLServer created.");
		
		// Create security manager
		if(System.getSecurityManager()==null) {
			System.setSecurityManager(new RMISecurityManager());
		}
		System.out.println("Success: Security manager set.");
		
		// Create sslRegistry
		try {
			sslRegistry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT,
					new SslRMIClientSocketFactory(), 
					new SslRMIServerSocketFactory());
				//sslRegistry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
			} catch (RemoteException e) {
			System.out.println("Error: Cannot create SSLRegistry: RemoteException.");
		}
		System.out.println("Success: SSLRegistry created.");
		
		// Bind sslServer to registry
		try {
			sslRegistry.bind("SSLSERVER", sslServer);
		} catch (AccessException e) {
			System.out.println("Error: Cannot bind SSLServer: AccessException");
			System.exit(0);
		} catch (RemoteException e) {
			System.out.println("Error: Cannot bind SSLServer : RemoteException");
			System.exit(0);
		} catch (AlreadyBoundException e) {
			System.out.println("Error: Cannot bind SSLServer: AlreadBoundException.");
			System.exit(0);
		}
		System.out.println("Success: SSLServer bound.");
	}
}
```

Der Client: Verbindet sich zum Server und soll einen String zur Verarbeitung senden.

```
public class SSLClient {
	private SSLServerInterface sslServer = null;
	private Registry sslRegistry = null;

	public SSLClient() {
	}
	
	public boolean connect(String ip, String name) {
		try {
			sslRegistry = LocateRegistry.getRegistry("localhost", Registry.REGISTRY_PORT);
			sslServer = (SSLServerInterface)sslRegistry.lookup(name);
		} catch (RemoteException e) {
			System.out.println("Client: RemoteException: connect()");
			return false;
		} catch (NotBoundException e) {
			System.out.println("Client: NotBoundException: connect()");
			return false;
		}
		return true;
	}
	
	public String getMessageFromServer(String msg) {
		String result = null;
		try {
			result = sslServer.getMessage(msg);
		} catch (RemoteException e) {
			return "Error: getMessageFromServer: RemoteException.";
		}
		return result;
	}
}
```

Und schließlich der ClientStarter, der den Client aufruft und ihn nacheinander seine Funktionen abarbeiten lässt.

```
public class clientStarter {
	public static void main(String args[]) {
		SSLClient c = new SSLClient();
		String msg = "foo";
		
		if(c.connect("localhost", "SSLSERVER")==false) {
			System.out.println("Error client connect");
			System.exit(0);
		}
		
		System.out.println("Client sending: " + msg);
		msg = c.getMessageFromServer(msg);
		System.out.println("Client received: " + msg);
	}
}
```

Der Output vom serverStarter ist wie folgt:


> Success: SSLServer created.
> Success: Security manager set.
> Success: SSLRegistry created.
> Success: SSLServer bound.



Und der vom clientStarter:


> Client: RemoteException: connect()
> Error client connect



Als Parameter für den serverStarter verwende ich:


> -Djava.rmi.server.hostname=localhost
> -Djava.security.policy=rmi.policy



Für den Client habe ich keine Parameter angegeben.

Wenn ich die Version ohne SSL verwendet funktioniert das Projekt (siehe auskommentierte Zeilen in SSLServer-Konstruktor und serverStarter Registry-Aufruf).

Schonmal im Voraus vielen Dank an alle, die sich die Mühe machen, sich mit dem Problem zu befassen.


----------



## L-ectron-X (17. Apr 2007)

Du bindest den Server an Port 1100, den Client lässt du aber auf Port 1099 los.
Kann auch falsch liegen, hab mit RMI und SSL noch nichts gemacht.
Vielleicht hast du noch Ports in der Firewall geschlossen. Hast du die Port 1099 und 1100 geöffnet?


----------



## Gerinald (17. Apr 2007)

Stimmt, ich habe im ServerKonstruktor beim Port noch ein +1 stehen gehabt. Aber auch wenn ich das entferne, erhalte ich exakt das selbe Ergebnis.

Danke für den Hinweis.


----------



## Gerinald (17. Apr 2007)

Die Ports müssten offen sein. Ich arbeite lokal und ohne SSL funktioniert das Beispiel.


----------

