# Sicherheit bei entferntem Methodenaufruf mittels RMI



## Recco (30. Mai 2009)

Hallo Forum!
Ich habe einen Server geschrieben, der als .jar mit "server" signiert wird:


```
public class ServerImpl extends UnicastRemoteObject implements Server{
	
    public ServerImpl() throws RemoteException
    {		
        System.getProperties().put("java.security.policy","java.policy");		
        System.setSecurityManager(new RMISecurityManager());		
        try {				
            LocateRegistry.createRegistry(8080);
            Naming.rebind("rmi://localhost:8080/Server", this);		    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String getText()
    {
        return "Ich bin vom Server!";
    }
}
```

Dazu auch das Interface, welche ich jetzt mal weg lasse. 
Dann habe ich noch einen Client geschrieben, der den Server per RMI nutzt:


```
public class Client extends JFrame{

private Server obj = null;
	
    public Client()
    {		
        obj = (Server)Naming.lookup("rmi://192.168.62.21:8080/Server");
        System.out.println(obj.getText());
    }

    public static void main(String[] args)
    {		
        Client bla = new Client();
    }
}
```

Und zu guter Letzt noch die Policy für den Server:


```
keystore "file:/C:/Pfad/.keystore";

grant signedBy "server"
{
   // Allow the server to connect
   permission java.net.SocketPermission "*:1024-", "accept, connect, resolve";
};
```

Das ganze läuft soweit auch problemlos zwischen zwei verschiedenen Rechnern.
Nun ist es ja so, das jeder beliebige Client auf die Methode vom Server zugreifen kann. 

Meine Frage: *Ist es möglich die Methode so abzusichern, dass nur Clients, die von mir signiert sind, diese benutzen dürfen?* Hab schon ein wenig im Internet gesucht aber nichts passendes dazu gefunden. Müsste ich dazu selber einen SecurityManager schreiben oder gibts es da schon etwas fertiges?

Über Eure Hilfe wäre ich sehr dankbar!

Gruß Recco


----------



## Recco (2. Jun 2009)

Hat wirklich keine eine Idee um das Problem zu lösen? Oder habe ich meine Frage evtl. unverständlich gestellt?

Wäre über Ideen wirklich sehr dankbar!

Gruß Recco


----------



## tfa (2. Jun 2009)

Die Überprüfung, ob ein Client eine Service-Methode aufrufen darf, muss auf dem Server stattfinden. Die dazu notwendige Information über den Client, darf nicht im Client selbst fest verdrahtet sein, wie etwa eine Prüfsumme oder sowas. Normalerweise sollte sich der Client mit einem Passwort anmelden, das der Anwender eingibt. Alles andere lässt sich durch Dekompilation/Debugging des Clients knacken oder umgehen.


----------



## Recco (2. Jun 2009)

An eine Anmeldung mit Passwort hatte ich auch schon gedacht.

Ist es denn überhaupt nicht möglich zu überprüfen ob die Client Applikation von mir signiert wurde und, falls das der Fall ist, die entsprechenden Rechte bekommt?

Gruß Recco


----------



## SlaterB (2. Jun 2009)

Netzwerk-Pakete können immer kopiert werden, 
der Server kann sich nicht mal sicher sein, dass auf der anderen Seite überhaupt ein Java-Programm sitzt


----------

