• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Lezione 7: Remote Method Invocation e SSL
 

Lezione 7: Remote Method Invocation e SSL

on

  • 2,062 views

✦ Esecuzione del programma

✦ Esecuzione del programma
✦ RMI e SSL

Statistics

Views

Total Views
2,062
Views on SlideShare
2,028
Embed Views
34

Actions

Likes
0
Downloads
0
Comments
0

2 Embeds 34

http://bizarro.iobloggo.com 23
http://www.slideshare.net 11

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Lezione 7: Remote Method Invocation e SSL Lezione 7: Remote Method Invocation e SSL Presentation Transcript

    • Lezione 7: Remote Method Invocation e SSL Corso di Programmazione in Rete Laurea Magistrale in Ing. Informatica Università degli Studi di Salerno 1
    • Outline ✦ Esecuzione del programma ✦ RMI e SSL 2
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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
    • 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