Tecnologie per la Sicurezza L-S AA 2012-2013 Anna Chiara Bellini [email protected] Classe java.security.Security ◦ Rappresenta la configurazione del framework di sicurezza Classi Engine ◦ Permettono di richiedere al framework i diversi servizi: firma, hashing, prng… Provider ◦ Forniscono le implementazioni dei servizi ◦ Provider SUNxxx ◦ Provider BouncyCastle Il controllo di sicurezza del codice prevede l’uso di file JAR firmati Per riconoscere una firma è necessario averla ricevuta in maniera affidabile Serve uno storage sicuro, in cui mantenere le firme della cui autenticità siamo sicuri Serve uno storage sicuro anche per mantenere le proprie firme, sia autogenerate che rilasciate da un’autorità Java fornisce una definizione di storage per la gestione di chiavi e certificati, nella classe java.security.KeyStore Il JDK viene distribuito con un’implementazione proprietaria di keystore, chiamata JKS ◦ Conformemente al framework JCA, è implementata come un servizio di tipo “KeyStore” keystore di sistema: Keystore utente: ◦ $JAVA_HOME/lib/security/cacerts ◦ Contiene i certificati delle CA riconosciute ◦ $HOME/.keystore ◦ Contiene le chiavi dell’utente e quelle che l’utente riconosce La distribuzione del JDK contiene un tool a riga di comando per gestire il keystore: keytool.exe Permette di ◦ ◦ ◦ ◦ ◦ ◦ Creare chiavi private Creare chiavi simmetriche Esportare certificati con la chiave pubblica Importare chiavi Generare richieste di certificazione per una CA Importare le risposte della CA Il comando keytool richiede sempre la password di accesso al keystore, per verificarne l’integrità Quando si devono solo leggere informazioni, la password è opzionale: una parte del keystore è accessibile in chiaro L’accesso alle informazioni più sensibili, come le chiavi private, e la modifica del keystore richiedono la password Lo stesso si applica accedendo al keystore tramite API Per generare una coppia di chiavi privata/pubblica: keytool –genkeypair –alias AliasChiave –keyalg alg La chiave privata viene salvata all’interno del keystore. ◦ Il JDK non fornisce un metodo diretto per esportare la chiave privata in un file ◦ E’ possibile specificare una ulteriore password per proteggere la chiave privata La chiave pubblica viene incapsulata in un certificato X.509 ◦ Il keytool richiede le informazioni di base per identificare l’utente: nome, cognome, località, unità organizzativa ◦ E’ possibile esportare il certificato in un file Per generare una chiave segreta: keytool –genseckey –alias KeyName –storetype JCEKS –keyalg ALG Il tipo di default JKS non può memorizzare chiavi segrete. E’ tuttavia possibile trasformare uno store JKS in JCEKS semplicemente specificando lo storetype quando si aggiunge una chiave segreta. Da quel momento in poi, è sempre necessario specificare il tipo JCEKS Generare una coppia di chiavi privata/pubblica con algoritmo RSA Creare un jar con una classe eseguibile che richiede un’operazione controllata, come l’accesso a un file Firmare il jar con la propria chiave privata con lo strumento jarsigner Esportare il certificato della chiave pubblica e scambiare le chiavi pubbliche e i jar firmati con un compagno Importare la chiave pubblica ricevuta Impostare i permessi corretti nel .java.policy Eseguire la classe ricevuta nell’ambito di un secure class loader Usare le API del servizio KeyStore per ◦ Creare un keystore di tipo JCEKS KeyStore ks = KeyStore.getInstance(“JCEKS”); ◦ Caricare il file .keystore nella home dell’utente ks.load(new FileInputStream(“…home/.keystore”), “password”.toCharArray()); ◦ Reperire la chiave privata ◦ Firmare il file come visto la settimana scorsa, salvando solo la firma e non la chiave pubblica (è quella esportata nel certificato)