Questa Applet richiede l'immissione da parte dell'utente:
- del nome assoluto del profilo utente (certificato rilasciato da Entrust Manager);
N.B.
Tale certificato si può trovare ovunque sul PC dell'utente. Questo perchè dopo che è stato emesso da Entrust Manager, l'utente può farne ciò che desidera. Per esempio: potrebbe copiarlo su un dischetto che ha sempre con sé oppure nasconderlo all'interno di un direttorio al quale solo esso può accedere, ecc... .
|
- della password per effettuare l'autenticazione del cliente durante la connessione col server.
Cliccare sull'immagine per ingrandire.
UtenteRegistrato.java:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.*;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.security.cert.X509Certificate;
import javax.naming.*;
import javax.naming.directory.*;
import iaik.asn1.structures.AlgorithmID;
import iaik.asn1.structures.Name;
import iaik.pkcs.PKCSException;
import iaik.pkcs.pkcs7.*;
import iaik.security.ssl.*;
//import iaik.x509.X509Certificate;
import com.entrust.util.*;
import com.entrust.security.provider.*;
import com.entrust.security.exceptions.*;
import com.entrust.*;
import com.entrust.x509.*;
import com.entrust.x509.directory.*;
import com.entrust.toolkit.*;
public class UtenteRegistrato extends Applet
{
// Oggetti della comunicazione SSL
SSLClientIOStream SSL = null;
X509Certificate[] Certs = new X509Certificate[1];
ETKPKCS7 pkcs7 = null;
// Flag interno
boolean ConnectedToServer = false;
// Variabili e parametri del Frame
TextArea ProgressText;
Label ProfileLabel,PassLabel,LineaVuota;
TextField ProfileName, ProfilePassword;
Button Connetti, Disconnetti, Cancella = null;
// Parametri delle Applet
String ap_directoryIP = null;
int ap_directoryIO = 389;
String ap_SSLserverIP = null;
int ap_SSLserverIO = 234;
String ap_profilePath = null;
static String managerIP;
static int managerIO;
long timertime;
private Frame statoConnessione = new StatoConnessione();
/* Le 2 funzioni che seguono servono unicamente per valutare il tempo richiesto da ogni singola operazione effettuata dal Server durante la connessione. Non hanno alcuna utilità pratica se non quella di facilitare il debug del servizio./*
public void startTiming() {
timertime = System.currentTimeMillis();
}
public String stopTiming() {
return String.valueOf( System.currentTimeMillis() - timertime );
}
// Inizializzazione dell'interfaccia utente
public void init(){
// Inizializzazione del gestore degli eventi
EventHandler GestoreEventi = new EventHandler();
// Inizializzazione layout
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridbag);
this.setSize(300,160);
ProfileLabel= new Label("Nome assoluto del file di certificato: (.epf)");
c.fill=c.BOTH;
c.anchor=c.NORTHWEST;
c.gridwidth= c.REMAINDER;
gridbag.setConstraints(ProfileLabel,c);
this.add(ProfileLabel);
ProfileName= new TextField("");
ProfileName.addKeyListener(GestoreEventi);
c.fill=c.HORIZONTAL;
c.gridwidth= c.REMAINDER;
gridbag.setConstraints(ProfileName,c);
this.add(ProfileName);
PassLabel= new Label("Password:");
c.fill=c.HORIZONTAL;
c.gridwidth= c.REMAINDER;
gridbag.setConstraints(PassLabel,c);
this.add(PassLabel);
ProfilePassword=new TextField("");
c.fill=c.HORIZONTAL;
c.gridwidth= c.REMAINDER;
ProfilePassword.setEchoChar('*');
ProfilePassword.addKeyListener(GestoreEventi);
gridbag.setConstraints(ProfilePassword,c);
this.add(ProfilePassword);
LineaVuota= new Label("");
c.fill=c.HORIZONTAL;
c.gridwidth= c.REMAINDER;
gridbag.setConstraints(LineaVuota,c);
this.add(LineaVuota);
Connetti=new Button("Connetti");
c.fill=c.HORIZONTAL;
c.gridwidth= 1;
Connetti.addActionListener(GestoreEventi);
gridbag.setConstraints(Connetti,c);
this.add(Connetti);
Cancella=new Button("Cancella");
c.fill=c.HORIZONTAL;
c.gridwidth= 2;
Cancella.addActionListener(GestoreEventi);
gridbag.setConstraints(Cancella,c);
this.add(Cancella);
Disconnetti=new Button("Disconnetti");
c.fill=c.HORIZONTAL;
c.gridwidth= c.REMAINDER;
Disconnetti.addActionListener(GestoreEventi);
gridbag.setConstraints(Disconnetti,c);
this.add(Disconnetti);
// Inizializzazione delle JCE ed dell'Entrust Toolkit
com.entrust.util.Util.initCiphers();
/* Il fallimento della nostro progetto è legato essenzialmente a questa funzione, la quale, una volta eseguita, genera un errore di inizializzazione visibile all'interno della console Java. */
}
/********************************************************************
Definizione delle procedure che si occupano di aggiornare il Random Seed e le Chiavi.
********************************************************************/
public void RandomSeedUpdate( EntrustProfile profile ) {
try {
if ( profile.randomSeedRequired() ) {
System.out.print( " aggiorno il random seed..." );
profile.randomSeedUpdate( null );
try {
// Scrittura del profilo aggiornato
FileOutputStream output = new FileOutputStream( ProfileName.getText() );
profile.write( output );
output.close();
} catch ( Exception ex ) {
System.out.println( "Fallito\n" );
ex.printStackTrace();
}
} else System.out.print( " random seed già esiste.\n" );
} catch ( EntrustBaseException ebex ) {
System.out.println( "\n ! EntrustBaseException : " + ebex.getMessage() );
}
}
public void KeyUpdate( EntrustProfile profile ) {
try {
// Si controlla se le chiavi debbono essere aggiornate...
if ( profile.encryptionKeyUpdateRequired() )
Update( profile, EntrustProfile.EncryptionKeys );
else System.out.print( " non si richiedono aggiornamenti dell'encryption key .\n" );
if ( profile.signingKeyUpdateRequired() )
Update( profile, EntrustProfile.SigntureKeys );
else System.out.print( " non sono richieste aggiornementi della signing key.\n" );
} catch ( EntrustBaseException ebex ) {
System.out.println( "\n ! EntrustBaseException : " + ebex.getMessage() );
}
}
public void Update( EntrustProfile profile, int keyType ) {
try {
EntrustManagerTransport transport = new EntrustManagerTransport( managerIP, managerIO );
// Si effettua l'update delle chiavi
if ( profile.updateKeys( transport, keyType ) ) {
try {
System.out.print( "Sto scrivendo..." );
FileOutputStream output = new FileOutputStream( ProfileName.getText() );
profile.write( output );
output.close();
} catch ( Exception ex ) {
System.out.print( "Scrittura fallita\n informare il manager..." );
// Si informa l'E.M. che la memorizzazione del profilo è fallita
profile.writeComplete( transport, false );
return;
}
// Si informa l'E.M. che la memorizzazione del profilo ha avuto successo
profile.writeComplete( transport, true );
} else System.out.println( "-- Nessun aggiornamento richiesto." );
} catch ( Exception ex ) {
System.out.println( "fallito\n" );
ex.printStackTrace();
}
}
/********************************************************************
Questo distruttore assicura che il cliente si disconnetta dal server prima di uscire, permettendo quindi ad un singolo server di gestire nel tempo connessioni multiple di clienti.
********************************************************************/
public void destroy() {
if ( ConnectedToServer ) {
DisconnectFromServer();
}
super.destroy();
}
/********************************************************************
Questa routine crea una connessione, secondo il protocollo SSL, col server WEB;
la comunicazione avrà termine solo all'atto della disconnessione.
********************************************************************/
public boolean ConnectToServer() {
try {
long starttime = System.currentTimeMillis();
// Si definisce il profilo
EntrustProfile profile = new EntrustProfile();
ProgressText.append( " Logging on...\n" );
startTiming();
profile.logon( new FileInputStream( ProfileName.getText() ),
new StringBuffer( ProfilePassword.getText() ) );
if ( profile.randomSeedRequired() ) {
// Si assicura che il profilo contenga un random seed
RadomSeedUpdate( profile );
}
if ( profile.keyUpdateRequired() ) {
// Si assicura che le chiavi di profilo non siano scadute
KeyUpdate( profile );
}
// Si prepara l'oggetto helper ETKPKCS7 se non ne abbiamo già uno
if ( pkcs7 == null ) {
ProgressText.append( " creo l'help PKCS7 ... " );
startTiming();
pkcs7 = new ETKPKCS7( profile );
ProgressText.append( " [ " + stopTiming() + "ms ]\n" );
}
// Connessione alla directory JNDI
ProgressText.append( " connessione alla directory..." );
startTiming();
JNDIDirectory directory = new JNDIDirectory( ap_directoryIP,
ap_directoryIO );
directory.connect();
ProgressText.append( " [ " + stopTiming() + "ms ]\n" );
// Si stabilisce una connessione col server
ProgressText.append( " connessione al server... " );
startTiming();
SSL = new SSLClientIOStream( "http://AndreA", ap_SSLserverIO,
profile, directory );
// Connessione avvenuta ......, ma non è ancora possibile // iniziare la sessione
ConnectedToServer = true;
ProgressText.append( " [ " + stopTiming() + "ms ]\n" );
// Si legge il certificato del server
if ( Certs[0] == null ) { // Si controlla però di non esserne già in possesso
ProgressText.append( " lettura del certificato dal server ... " );
startTiming();
Certs[0] = (iaik.x509.X509Certificate)SSL.getSocket().getSession().getPeerCertificate().getCertificateChain()[0];
ProgressText.append( " [ " + stopTiming() + "ms ]\n" );
}
// Si visualizza il tempo totale di elaborazione della routine
timertime = starttime;
ProgressText.append( " [ completato in " + stopTiming() + "ms\n" );
ProgressText.append( "\n [ pronti a cominciare ------------------------\n" );
return (true);
} catch (Exception ex) {
if ( ex.getMessage().equals( "Connection Refused!" ) ) {
ProgressText.append( "\n>> Connessione Rifiutata\n" );
} else if ( ex.getMessage().equals( "Incorrect password!" ) ) {
ProgressText.append( "\n>> Password non corretta\n" );
} else if ( ex instanceof FileNotFoundException ) {
ProgressText.append( "\n>> Profilo non trovato\n" );
} else {
ProgressText.append( "\n>> Un errore è avvenuto durante la connessione\n" );
ex.printStackTrace();
}
ProgressText.append( "\n [ pronto alla connessione ----------------------\n" );
return (false);
}
}
/********************************************************************
Disconnessione dal server e chiusura del canale sicuro SSL.
********************************************************************/
public void DisconnectFromServer() {
try {
SSL.outputStream().flush();
SSL.outputStream().close();
ConnectedToServer = false;
ProgressText.append( "\n [ pronto alla connessione ----------------------\n" );
} catch ( IOException e ) {
ProgressText.append( "\n ! Errore durante la disconnessione\n" );
e.printStackTrace();
}
}
/********************************************************************
Si intercettano gli eventi:
-> premendo il pulsante "Connetti" viene creata la connessione
-> premendo il pulsante "Disconnetti" viene interrotta la connessione
-> premendo annulla viene cancellato l'attuale contenuto delle aree di input
********************************************************************/
class EventHandler implements ActionListener, KeyListener {
public void actionPerformed( ActionEvent ae ) {
if ( ae.getSource().equals( Connetti ) ) {
if ( ConnectedToServer ) {
ProgressText.append( "-- Sei già connesso\n" );
} else {
statoConnessione.setVisible(true);
if (ConnectToServer()==false) exit(1);
statoConnessione.setVisible(false);
try {
// Apertura della pagina che elenca le applicazioni noleggiabili
AppletContext context = getAppletContext();
URL u = new URL(getCodeBase().toString()+"Registrato.html");
context.showDocument(u);
} catch (MalformedURLException e) {
System.out.println(e);
}
}
} else if ( ae.getSource().equals( Disconnetti ) ) {
if ( ConnectedToServer ) {
statoConnessione.setVisible(true);
DisconnectFromServer();
statoConnessione.setVisible(false);
} else {
ProgressText.append( "-- Non Connesso\n" );
}
} else if ( ae.getSource().equals( Cancella ) ) {
System.out.println("Cancella");
ProfileName.setText("");
ProfilePassword.setText("");
}
}
public void keyPressed(KeyEvent e) {
// Ignora tutti i keyPressed KeyEvents
}
public void keyTyped(KeyEvent e) {
// Ignora tutti i keyTyped KeyEvents
}
public void keyReleased(KeyEvent e) {
// Ignora tutti i KeyReleased KeyEvents
}
}
/******************************************************************** Inizializzazione del Frame nel quale verrà visualizzato lo stato delle operazioni effettuate durante la connessione. ********************************************************************/
class StatoConnessione extends Frame {
public StatoConnessione() {
GridBagLayout gridbag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
this.setLayout(gridbag);
setSize(500,250);
setTitle("Stato della connessione:");
ProgressText = new java.awt.TextArea();
ProgressText.setFont( new Font( "Courier", Font.PLAIN, 12 ) );
ProgressText.setEditable( false );
c.fill = c.BOTH;
c.anchor = c.NORTHWEST;
c.gridwidth = c.REMAINDER;
gridbag.setConstraints( ProgressText, c );
this.add( ProgressText );
}
}
}
|