avatar

Differenze tra keystore e truststore @ Serena Sensini | Giovedì 24 Marzo 2022 | 4 minuti

 

Keystore e Truststore sono entrambi importanti ed essenziali per la comunicazione tramite un certificato SSL.

 

Entrambi sono molto simili in termini di costrutto e struttura, poiché entrambi sono gestiti da uno strumento chiamato keytool, ma sono anche molto diversi… In cosa?

 

Vediamo le differenze tra keystore e truststore!

 

Keystore

 

Il keystore viene utilizzato per archiviare chiavi private e certificati di identità che un programma specifico dovrebbe presentare a entrambe le parti (server o client) per la verifica.

 

In altre parole, il keystore contiene i certificati di identificazione che ci identificano e sono informazioni private e sensibili, come la coppia chiave pubblica e privata.

 

Il keystore viene utilizzato dal KeyManager di Java per inviare le credenziali di autenticazione ad un host remoto per autenticarsi durante un processo di handshake.

 

Il TrustManager di Java verifica che le credenziali condivise dal server corrispondano con quelle presenti nel truststore e in tal caso consente la connessione.

 

Truststore

 

Il truststore viene utilizzato per memorizzare i certificati forniti dalle Certified Authorities (CA) che verificano il certificato presentato dal server in una connessione SSL e ne autorizzano la comunicazione sicura.

 

In altre parole, il truststore contiene certificati che identificano gli altri e sono informazioni non private, ma di pubblico dominio.

 

Differenze

 

Entrambi sono genericamente resi disponibili tramite file in formato .jks (ossia Java Key Store) ed entrambi vengono aggiunti all’applicazione Java tramite delle opzioni Java come mostrato di seguito:

 

javax.net.ssl.trustStore # specifica il path del trustStore
javax.net.ssl.keyStore # specifica il path del keyStore
Djavax.net.ssl.trustStorePassword # specifica la password del trustStore
Djavax.net.ssl.keyStorePassword # specifica la password del keyStore

 

A parte ciò, le principali differenze possono essere riassunte nello schema di seguito:

 

TruststoreKeystore
TrustStore memorizza le credenziali di altri.Keystore memorizza le tue credenziali, come chiavi private o certificati di identità.
La configurazione di TrustStore è necessaria per la corretta connessione lato client.Il Keystore è necessario quando si configura la comunicazione client-server.
Un TrustStore contiene i certificati dei sistemi esterni di cui ti fidi.Un KeyStore contiene i certificati della tua applicazione.

 

Esempio

 

Se lavoriamo con un sistema A che funge da sistema di autenticazione, questo lavorerà come fosse un componente client.

 

Se un sistema esterno B, quindi un server, avrà bisogno di autenticarsi, potrà inviare il proprio keystore al sistema A, il quale verificherà che le credenziali condivise dal server corrispondano con quelle che possiede il TrustManager e in tal caso consentità la comunicazione.

 

Come accorgersi che manca un certificato all’applicazione? Se ad esempio riscontriamo un errore come quello riportato di seguito, la nostra applicazione con tutta probabilità non riesce ad autenticare il sistema con cui sta cercando di comunicare:

 

{"error.stacktrace":"s.s.p.c.SunCertPathBuilderException:
unable to find valid certification path to requested target\nat
s.s.p.c.SunCertPathBuilder.build(SunCertPathBuilder.java:141)\nat
s.s.p.c.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126)\nat
j.s.c.CertPathBuilder.build(CertPathBuilder.java:280)\nat
s.s.v.PKIXValidator.doBuild(PKIXValidator.java:445)\n... 131 common
frames omitted\nWrapped...

 

In questo caso, è necessario importare il truststore all’interno della nostra applicazione!

 

Se invece la comunicazione deve avvenire in mutua autenticazione, è allora necessario fornire sia keystore che truststore alla nostra applicazione per far sì che la comunicazione avvenga correttamente.

 

Generare keystore e truststore

 

Java ci mette a disposizione uno strumento chiamato keytool per la gestione dei keystore e la generazione di certificati. Per generare i due, seguiamo i seguenti step:

 

Con il seguente comando, andiamo a generare un keystore e salvarlo nel file my-keystore.jks Per il certificato, identificato con l’alias theredcode.it è utilizzato l’algoritmo RSA con chiavi di lunghezza 2048; è possibile anche fornire una password che ne consenta maggior sicurezza.

 

keytool -genkey -alias theredcode.it -keyalg RSA -keystore my-keystore.jks -keysize 2048

 

Per creare il truststore, dal keystore estraiamo il certificato che conterrà esclusivamente la chiave pubblica e lo facciamo con il seguente comando:

 

keytool -export -alias theredcode.it -file my-cert.crt -keystore my-keystore.jks -storepass changeme

 

Generiamo il truststore dove inserire il certificato e lo facciamo creando un keystore vuoto eliminando il certificato al suo interno con i seguenti comandi:

 

keytool -genkey -alias theredcode-alias -keystore theredcode-truststore.jks
keytool -delete -alias theredcode-alias -keystore theredcode-truststore.jks

 

Inseriamo il certificato pubblico estratto in precedenza e abbiamo fatto!

 

keytool -import -trustcacerts -alias theredcode.it -file my-cert.crt -keystore theredcode-truststore.jks

 

Comandi utili

 

Come verifico le informazioni presenti all’interno di un certificato o di un keystore?

 

keytool -printcert -v -file my-cert.crt # controllare un certificato stand-alone
keytool -list -v -keystore keystore.jks # controllare quali certificati sono presenti nel keystore
keytool -list -v -keystore keystore.jks -storepass changeme # come sopra, ma memorizza la password

 

E per elencare tutti i CA certs presenti?

 

keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Ti potrebbe interessare anche...

avatar

Social