# Methodenaufruf per SSL ( RMI )



## Tallan (26. Aug 2009)

Hallo zusammen,

ich versuche mich grade daran RMI mittels ssl zu verschlüsseln, allerdings ist mir trotz zahlreicher tutorials die das ganze mehr oder weniger beschreiben der ablauf schleierhaft.

Demzufolge habe ich ein ganz simples rmi programm geschrieben bei dem der client einfach nur einen  methode mit einem mitgeliefertem parameter auf dem server aufruft.


```
package client;


import java.rmi.Naming;
import java.rmi.RemoteException;
import server.ServerInterface;


public class Client{

	//Attribute
	private String surl;
	private ServerInterface s;

	public Client() {

 		surl = "rmi://localhost:9999/MyServer";
 		try {
			s = (ServerInterface)Naming.lookup(surl);
		}

		catch (Exception ex) {
			System.out.println(ex.getMessage());	
		}

	}

	public void print(String str) throws RemoteException {
		s.print(str);
		
	}

	public static void main (String [] args) 
	{
		try {
			String str = "asdf";
			Client c = new Client();
			System.out.println("Client sendet" + str);
			c.print(str);
		}
		catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
	}
}
```


```
package server;

import java.rmi.*;
import java.rmi.server.*;
import java.rmi.registry.*;


public class Server extends UnicastRemoteObject implements ServerInterface {


	private static final long serialVersionUID = 1L;

 
	public Server() throws RemoteException {
		super();	
		int port = 9999;
		Registry reg;
		try {
			reg = LocateRegistry.createRegistry(port); 
			reg.bind("MyServer", this);
			System.out.println("Server gestartet");
		}
		catch (Exception ex) {
			System.out.println(ex.getMessage());	
		}

		
	}
	
	
	public synchronized void print(String str)  {
		System.out.println("Server : " + str);
	}
	
	
	public static void main (String [] args) throws RemoteException {

		new Server();

	}
}
```


```
package server;
import java.rmi.*;

/**
 * Diese Interface definiert Methoden
 */ 
public interface ServerInterface extends Remote {
	
 	
	public void print (String str) throws RemoteException;
	

}
```


Diesen methodenaufruf würde ich nun gern per ssl verschlüsseln, allerdings versteh ich nicht wircklich wie das gehen soll.

Ein beispiel wie man einen Stream durch SSL verschlüsselt konnte ich basteln


```
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.*;

public
class EchoClient {
    public
            static
    void
            main(String[] arstring) {
        try {
            SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
            SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", 9999);
            //usereingabe
            InputStream inputstream = System.in;
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
            //outstream für den server
            OutputStream outputstream = sslsocket.getOutputStream();
            OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream);
            BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter);

            String string = null;
            //einlesen der usereingabe
            while ((string = bufferedreader.readLine()) != null) {
            	//gelesene daten an den server schreiben
                bufferedwriter.write(string + '\n');
                bufferedwriter.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
```



```
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public
class EchoServer {
    public
            static
    void
            main(String[] arstring) {
        try {
            SSLServerSocketFactory sslserversocketfactory =
                    (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket sslserversocket =
                    (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
            SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

            //output des client ist der input des server
            InputStream inputstream = sslsocket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            String string = null;
            //output des clients lesen
            while ((string = bufferedreader.readLine()) != null) {
            	//ausgeben
                System.out.println(string);
                System.out.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
```


allerdings weiss ich nicht wie ich auf die methoden auf dem server über einen ssl socket zugreifen kann / soll.

Hat da jemand einen Rat oder könnte mir das grob erklären ?


----------



## tuxedo (26. Aug 2009)

Naja, das hier ist doch das offizielle Tutorial: 


Using a Custom RMI Socket Factory

Using RMI with SSL

Genauer und ausführlicher geht's kaum.


----------



## Tallan (26. Aug 2009)

tuxedo hat gesagt.:


> Naja, das hier ist doch das offizielle Tutorial:
> 
> 
> Using a Custom RMI Socket Factory
> ...



Ja die habe ich mir schon angeschaut, aber ehrlichgesagt es erschlägt mich etwas und so richtig blicke ich da noch nicht durch zumal die ssl verschlüsselung darin selbst ja nicht behandelt wird sondern nur wie man Sockets einbindet, wobei man dann wiederrum sslsockets erstellen kann .... daher die frage ob mir das jemand der sich damit auskennt im groben erklären kann 
mir ist klar das das viel "verlangt" ist und sich wohl auch niemand findet der die zeit opfern will aber ein versuch ist es allemal wert, ich werde derweilen weiter versuchen mich durchzuarbeiten und auch deine vorgeschlagene alternative mit SIMON testen.


----------



## tfa (26. Aug 2009)

tuxedo hat gesagt.:


> Naja, das hier ist doch das offizielle Tutorial:
> 
> 
> Using a Custom RMI Socket Factory
> ...


Was denn jetzt? RMI oder SIMON?

Es gäbe da auch noch Spring mit verschiedenen Remoting-Protokollen: RMI, HTTP-Invoker, mit oder ohne SSL, etc.


----------



## Tallan (26. Aug 2009)

tfa hat gesagt.:


> Was denn jetzt? RMI oder SIMON?
> 
> Es gäbe da auch noch Spring mit verschiedenen Remoting-Protokollen: RMI, HTTP-Invoker, mit oder ohne SSL, etc.



Nun ich suche einen effektiven möglichst einfachen weg per client methoden auf einem server aufzurufen und die client server kommunikation per ssl zu verschlüsseln, mein erster ansatz war/ist eben rmi


----------



## tuxedo (26. Aug 2009)

@tfa

Ja, das kommt davon wenn Themen in zwei Threads gleichzeitig behandelt werden. Siehe: http://www.java-forum.org/netzwerkprogrammierung/87456-remote-methode-invocation-ssl.html

@tallan

Naja, wenn du die Links aufmerksam gelesen hast, dann hast du auch die SSL Beispiele gefunden/gelesen. Die Quintessenz davon ist:

SIMON und RMI verhalten sich ähnlich was den "Aufwand" für SSL betrifft, wäre da nicht die "DefaultSslContextFactory" in SIMON die einem das Leben erleichtert.

Wie SSL mit Spring Remoting funktioniert: Kein Schimmer. Nie probiert.


----------

