Differenza tra un Keystore Java e un Truststore

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

In questo rapido articolo, forniremo una panoramica delle differenze tra un keystore Java e un truststore Java.

2. Concetti

Nella maggior parte dei casi, utilizziamo un keystore e un truststore quando la nostra applicazione deve comunicare su SSL / TLS .

Di solito, si tratta di file protetti da password che si trovano sullo stesso file system della nostra applicazione in esecuzione. Il formato predefinito utilizzato per questi file è JKS fino a Java 8 .

A partire da Java 9, tuttavia, il formato keystore predefinito è PKCS12 . La più grande differenza tra JKS e PKCS12 è che JKS è un formato specifico per Java, mentre PKCS12 è un modo standardizzato e indipendente dal linguaggio per archiviare chiavi private e certificati crittografati.

3. Java KeyStore

Un keystore Java memorizza voci di chiavi private, certificati con chiavi pubbliche o solo chiavi segrete che possiamo utilizzare per vari scopi crittografici. Memorizza ciascuno di essi con un alias per facilitare la ricerca.

In generale, i keystore contengono chiavi di proprietà della nostra applicazione che possiamo utilizzare per dimostrare l'integrità di un messaggio e l'autenticità del mittente, ad esempio firmando i payload.

Di solito, useremo un keystore quando siamo un server e vogliamo usare HTTPS . Durante un handshake SSL, il server cerca la chiave privata dal keystore e presenta la chiave pubblica e il certificato corrispondenti al client.

Di conseguenza, se il client deve anche autenticarsi - una situazione chiamata autenticazione reciproca - allora il client ha anche un keystore e presenta anche la sua chiave pubblica e il certificato.

Non esiste un keystore predefinito, quindi se vogliamo utilizzare un canale crittografato, dovremo impostare javax.net.ssl.keyStore e javax.net.ssl.keyStorePassword. Se il formato del nostro keystore è diverso da quello predefinito, potremmo usare javax.net.ssl.keyStoreType per personalizzarlo.

Naturalmente, possiamo usare queste chiavi per soddisfare anche altre esigenze. Le chiavi private possono firmare o decrittografare i dati e le chiavi pubbliche possono verificare o crittografare i dati. Anche le chiavi segrete possono svolgere queste funzioni. Un keystore è un luogo in cui possiamo conservare queste chiavi.

Possiamo anche interagire con il keystore a livello di programmazione.

4. Java TrustStore

Un truststore è l'opposto: mentre un keystore in genere conserva i certificati che ci identificano, un truststore conserva i certificati che identificano gli altri.

In Java, lo usiamo per fidarci della terza parte con cui stiamo per comunicare.

Prendiamo il nostro esempio precedente. Se un client parla con un server basato su Java tramite HTTPS, il server cercherà la chiave associata dal proprio keystore e presenterà la chiave pubblica e il certificato al client.

Noi, il cliente, cerchiamo quindi il certificato associato nel nostro truststore. Se il certificato o le autorità di certificazione presentate dal server esterno non si trovano nel nostro truststore, riceveremo un'eccezione SSLHandshakeException e la connessione non verrà impostata correttamente.

Java ha raggruppato un truststore chiamato cacerts e risiede nella directory $ JAVA_HOME / jre / lib / security .

Contiene autorità di certificazione affidabili e predefinite:

$ keytool -list -keystore cacerts Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 92 entries verisignclass2g2ca [jdk], 2018-06-13, trustedCertEntry, Certificate fingerprint (SHA1): B3:EA:C4:47:76:C9:C8:1C:EA:F2:9D:95:B6:CC:A0:08:1B:67:EC:9D

Qui vediamo che il truststore contiene 92 voci di certificati affidabili e una delle voci è la voce verisignclass2gca . Ciò significa che la JVM considererà automaticamente attendibili i certificati firmati da verisignclass2g2ca .

Qui, possiamo sovrascrivere la posizione del truststore predefinito tramite la proprietà javax.net.ssl.trustStore . Allo stesso modo, possiamo impostare javax.net.ssl.trustStorePassword e javax.net.ssl.trustStoreType per specificare la password e il tipo del truststore.

5. conclusione

In questo tutorial, abbiamo discusso le principali differenze tra il keystore Java e il truststore Java e il suo scopo.

Inoltre, abbiamo mostrato come i valori predefiniti possono essere sovrascritti con le proprietà di sistema.

Successivamente, potremmo dare un'occhiata alla seguente guida SSL o alla Guida di riferimento JSSE per ulteriori dettagli sulla comunicazione crittografata in Java.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO