Architettura di Crittografia in Java - LIA

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)