1. Lezione 7: Remote Method
Invocation e SSL
Corso di Programmazione in Rete
Laurea Magistrale in Ing. Informatica
Università degli Studi di Salerno
1
2. Outline
✦ Esecuzione del programma
✦ RMI e SSL
2
3. Esecuzione del programma
✦ Prima di lanciare il server occorre far
partire il programma rmiregistry
• il programma deve partire dalla directory in cui si
trovano i file .class
3
4. Passaggio dei parametri
✦ Nella chiamata a un metodo di un oggetto
locale, Java usa i seguenti meccanismi
per il passaggio dei parametri e del valore
di ritorno:
• per i tipi atomici il passaggio è per valore
• per tutti gli altri tipi, il passaggio è per riferimento
4
5. Passaggio dei parametri
✦ Nel caso di oggetti remoti, le regole
cambiano:
• per i tipi atomici il passaggio è per valore
• per gli oggetti che implementano un’interfaccia
remota, il passaggio è per riferimento (remoto)
• per i tipi serializzabili che non implementano
un’interfaccia remota il passaggio è per valore
• per tutti gli altri tipi, non è possibile utilizzarli
come parametro o valore di ritorno di un metodo
remoto
5
6. Passaggio dei parametri
✦ Conseguenze
• il comportamento di un metodo può cambiare a
seconda se l’oggetto è locale oppure remoto
• il passaggio per valore di un oggetto può avere un
impatto significativo sulle prestazioni, dal
momento che comporta la trasmissione su rete di
una versione serializzata dell’oggetto e di tutti gli
oggetti ad esso collegati!
• il server deve avere accesso ai .class delle classi
effettive dei parametri passati per valore
‣ non è sempre banale, per il polimorfismo
6
7. Passaggio dei parametri
✦ Esempio di codice che ha un effetto
diverso in un oggetto locale o in un
oggetto remoto
public void copia(int src[], int dest[]) {
for(int i=0; i<src.length; i++)
dest[i]=src[i];
}
✦ Infatti:
‣ in un oggetto locale, copia un array in un altro
array (passaggio per riferimento)
‣ in un oggetto remoto, non ha nessun effetto
(passaggio per valore)
7
8. RMI e SSL
✦ Per rendere sicura la comunicazione con
un oggetto remoto è possibile usare
socket SSL/TLS invece dei semplici socket
TCP
✦ Per cambiare il tipo di socket usato per la
connessione i passi sono:
• definire una factory per i server socket e una
factory per i client socket
• specificare le factory da usare nel costruttore
della classe di implementazione dell’oggetto
remoto
8
9. RMIServerSocketFactory
✦ L’interfaccia RMIServerSocketFactory (del
package java.rmi.server) rappresenta una
factory da usare per creare i server
socket associati a un oggetto remoto
✦ Le implementazioni devono definire il
metodo:
• ServerSocket createServerSocket(int port)
throws IOException
9
10. RMIServerSocketFactory
✦ Ad esempio, per creare socket SSL:
import java.io.*;
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.rmi.server.*;
public class RMISSLServerSocketFactory implements RMIServerSocketFactory {
public ServerSocket createServerSocket(int port) throws IOException {
ServerSocketFactory factory=SSLServerSocketFactory.getDefault();
return factory.createServerSocket(port);
}
}
10
11. RMIClientSocketFactory
✦ Interfaccia usata dal client per la
creazione del socket per connettersi
all’oggetto, usando il metodo
• Socket createSocket(String host, int port)
throws IOException
✦ L’istanza dell’implementazione viene
definita dall’applicazione server e
trasmessa al client quando richiede la
connessione all’oggetto
• perciò l’implementazione deve anche essere
Serializable
11
12. RMIClientSocketFactory
✦ Ad esempio, per creare socket SSL:
import java.io.*;
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.rmi.server.*;
public class RMISSLClientSocketFactory implements RMIClientSocketFactory, Serializable {
public Socket createSocket(String host, int port) throws IOException {
SocketFactory factory=SSLSocketFactory.getDefault();
return factory.createSocket(host, port);
}
}
12
13. Uso delle factory
✦ Occorre passare al costruttore di
UnicastRemoteObject la
RMIClientSocketFactory e la
RMIServerSocketFactory
• per questo occorre richiamare dal costruttore
della classe di implementazione il costruttore:
UnicastRemoteObject(int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
throws RemoteException
13
14. Uso delle factory
import java.rmi.*;
✦ Ad esempio, per l’oggetto calcolatrice:
import java.rmi.server.*;
public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
public CalculatorImpl(RMIClientSocketFactory clientFactory,
RMIServerSocketFactory serverFactory) throws RemoteException {
super(0, clientFactory, serverFactory);
}
public double add(double a, double b) {
return a+b;
}
public double divide(double a, double b) {
return a/b;
}
public double multiply(double a, double b) {
return a*b;
}
public double subtract(double a, double b) {
return a-b;
}
}
14
15. Modifiche al server
✦ Il server deve creare le factory definire le
system properties per accedere al key
store:
import java.net.*;
import java.rmi.*;
import java.rmi.server.*;
public class CalculatorServer {
public static void main(String args[]) throws RemoteException, MalformedURLException {
System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "pippobaudo");
RMIClientSocketFactory clientFactory=new RMISSLClientSocketFactory();
RMIServerSocketFactory serverFactory=new RMISSLServerSocketFactory();
Calculator calc=new CalculatorImpl(clientFactory, serverFactory);
Naming.rebind("calc", calc);
}
}
15
16. Modifiche al client
✦ Il client deve soltanto definire le system
properties per accedere al trust store:
import java.net.*;
import java.rmi.*;
public class CalculatorClient {
public static void main(String args[])
throws RemoteException, MalformedURLException, NotBoundException {
System.setProperty("javax.net.ssl.trustStore", "truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "pippobaudo");
Calculator calc=(Calculator)Naming.lookup("rmi://localhost/calc");
System.out.println("9 per 9 fa "+calc.multiply(9,9));
}
}
16
17. Modifiche al client
✦ Note
• è possibile che tra gli oggetti di uno stesso server
alcuni usino socket SSL e altri socket normali
• il client non deve decidere quale tipo di socket
usare per ciascun oggetto: il server provvede a
passargli la factory appropriata
• il meccanismo delle factory può essere usato
anche per usare altri meccanismi di
comunicazione
‣ es. HTTP tunneling per le reti dotate di firewall
17