Trust Store vs Key Store - creando con keytool


249

Comprendo che il keystore di solito conterrà le chiavi private / pubbliche e il trust store solo le chiavi pubbliche (e rappresenta l'elenco delle parti fidate con cui si intende comunicare). Bene, questa è la mia prima ipotesi, quindi se ciò non è corretto, probabilmente non ho iniziato molto bene ...

Mi interessava però capire come / quando si distinguono i negozi quando si usa keytool.

Quindi, finora ho creato un keystore usando

keytool -import -alias bob -file bob.crt -keystore keystore.ks

che crea il mio file keystore.ks. Rispondo yesalla domanda, mi fido di bob ma non mi è chiaro se questo ha creato un file keystore o un file truststore? Posso impostare la mia applicazione per utilizzare il file come entrambi.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

e con System.setProperty( "javax.net.debug", "ssl")set, posso vedere il certificato sotto certificazioni attendibili (ma non nella sezione keystore). Il particolare certificato che sto importando ha solo una chiave pubblica e intendo usarlo per inviare roba su una connessione SSL a Bob (ma forse è meglio lasciarla per un'altra domanda!).

Qualsiasi suggerimento o chiarimento sarebbe molto apprezzato. L'output di keytool è lo stesso qualunque cosa importiate e la sua giusta convenzione che dice che uno è un keystore e l'altro un negozio di fiducia? Qual è la relazione quando si utilizza SSL ecc?


Non sono sicuro di cosa intendi per "Il certificato particolare che sto importando ha solo una chiave pubblica": è solo una chiave pubblica (cioè non un certificato) o un certificato non CA?
Bruno,

hmmm, non sono sicuro. Ho esportato dal mio browser come file PEM. Questo aiuta?
Toby,

Se viene esportato dal browser, è probabilmente un certificato. È un certificato server (con un CN o subjectAltName che corrisponde al nome di un server)? È un certificato CA (guarda sotto Vincoli di base, dovresti essere in grado di vederlo usando il tuo browser).
Bruno,

2
tl; dr: i negozi di fiducia contengono certificati pubblici, attendibili, root (CA), mentre i negozi di identità / chiavi contengono certificati di identità privati; per quanto riguarda i file, tuttavia, sono gli stessi.
Andrew,

Risposte:


346

La terminologia è davvero un po 'confusa, ma entrambi javax.net.ssl.keyStoree javax.net.ssl.trustStoresono usati per specificare quali keystore usare, per due scopi diversi. I keystore sono disponibili in vari formati e non sono nemmeno necessariamente file (vedi questa domanda ), ed keytoolè solo uno strumento per eseguire varie operazioni su di essi (import / export / list / ...).

I parametri javax.net.ssl.keyStoree javax.net.ssl.trustStoresono i parametri predefiniti utilizzati per creare se KeyManagere TrustManager(rispettivamente), quindi utilizzati per creare un SSLContextche essenzialmente contiene le impostazioni SSL / TLS da utilizzare quando si effettua una connessione SSL / TLS tramite un SSLSocketFactoryo un SSLEngine. Queste proprietà di sistema sono proprio da dove provengono i valori predefiniti, che sono poi usati da SSLContext.getDefault(), stessi usati SSLSocketFactory.getDefault()per esempio. (Tutto ciò può essere personalizzato tramite l'API in diversi punti, se non si desidera utilizzare i valori predefiniti e quelli specifici SSLContextper un determinato scopo.)

La differenza tra KeyManagere TrustManager(e quindi tra javax.net.ssl.keyStoree javax.net.ssl.trustStore) è la seguente (citato dalla guida di riferimento JSSE ):

TrustManager: determina se le credenziali di autenticazione remote (e quindi la connessione) devono essere considerate attendibili.

KeyManager: determina quali credenziali di autenticazione inviare all'host remoto.

(Altri parametri sono disponibili e i loro valori predefiniti sono descritti nella guida di riferimento JSSE . Notare che mentre esiste un valore predefinito per l'archivio sicuro , non esiste uno per l'archivio chiavi.)

In sostanza, il keystore in javax.net.ssl.keyStoredeve contenere chiavi e certificati privati, mentre javax.net.ssl.trustStorecontiene i certificati CA di cui ti fidi quando una parte remota presenta il proprio certificato. In alcuni casi, possono essere lo stesso negozio, anche se spesso è meglio usare negozi distinti (specialmente quando sono basati su file).


grazie per la risposta, chiarisce un po 'le cose. Sono ancora confuso, tuttavia, quando si tratta di utilizzo, posso usare una chiave pri / pub pk12 (xxx.p12) come archivio chiavi (tramite -D) e creare una connessione SSL (attendibile) senza alcuna menzione di un truststore tramite - D ... vabbè.
Toby,

57
Non è necessario specificare un truststore, perché esiste un valore predefinito (è in bundle con JRE), di solito in $JAVA_HOME/lib/security/cacerts(consultare il 2 ° link della guida di riferimento JSSE che ho inviato). Come i browser, contiene un set predefinito di certificati CA attendibili. In generale, un client utilizzerà sempre un truststore per verificare il certificato del server ma il keystore verrà utilizzato solo se il server richiede un certificato client e il server utilizzerà sempre un keystore per la propria chiave + cert ma il truststore sarà solo utilizzato se il client invia un certificato client.
Bruno,

2
Grazie per informazioni utili In Weblogic, esiste un "archivio chiavi-identità" che memorizza il certificato SSL del server e quindi c'è un "archivio chiavi-fiducia" che memorizza i certificati SSL di cui il server si fida, quindi ho ragione se dico "chiave-identità -store "non è altro che un" keystore "e" trust-key-store "non è altro che un" truststore "?
hagrawal,

@Bruno dovremmo anche notare che quando c'è un "jssecacerts", "cacerts" viene ignorato?
kommradHomer,

61

Per spiegare in modo usecase / scopo comune o laico:

TrustStore : come indica il nome, viene normalmente utilizzato per archiviare i certificati di entità affidabili. Un processo può mantenere un archivio di certificati di tutte le parti di cui si fida.

keyStore : utilizzato per archiviare le chiavi del server (sia pubbliche che private) insieme al certificato firmato.

Durante l'handshake SSL,

  1. Un client tenta di accedere a https: //

  2. E così, il server risponde fornendo un certificato SSL (che è archiviato nel suo keyStore)

  3. Ora, il client riceve il certificato SSL e lo verifica tramite trustStore (ovvero il trustStore del client ha già un set predefinito di certificati di cui si fida). È come: posso fidarmi di questo server? È lo stesso server con cui sto cercando di parlare? Nessun attacco da intermediario?

  4. Una volta, il client verifica che sta parlando al server di cui si fida, quindi la comunicazione SSL può avvenire su una chiave segreta condivisa.

Nota: non sto parlando qui dell'autenticazione client sul lato server. Se un server desidera eseguire anche un'autenticazione client, il server mantiene anche un trustStore per verificare il client.


25

Non vi è alcuna differenza tra i file keystore e truststore. Entrambi sono file nel formato proprietario JKS. La distinzione sta nell'uso: per quanto ne so, Java utilizzerà solo l'archivio a cui fa riferimento la -Djavax.net.ssl.trustStoreproprietà di sistema per cercare certificati affidabili quando si creano connessioni SSL. Lo stesso vale per i tasti e -Djavax.net.ssl.keyStore. Ma in teoria va bene usare uno stesso file per trust e keystore.


4
È possibile utilizzare diversi tipi di keystore (ad esempio, PKCS12) impostando le proprietà del sistema javax.net.ssl.keyStoreTypee javax.net.ssl.trustStoreType.
Donal Fellows,

1
@Donal: buona aggiunta. Ti capita di sapere se esiste un elenco di tutti i contenitori supportati? Conosco solo PKCS12 e JKS (il primo è il risultato di tentativi ed errori ...).
musiKk

2
i formati del keystore variano a seconda dei provider disponibili (vedere questo elenco per quelli in bundle con Oracle JRE per impostazione predefinita). C'è stata anche una discussione in questa domanda . Altri provider (ad esempio BouncyCastle) possono essere utilizzati per altri formati.
Bruno,

21

Keystore viene utilizzato da un server per archiviare le chiavi private e Truststore viene utilizzato da client di terze parti per archiviare le chiavi pubbliche fornite dal server per accedere. L'ho fatto nella mia applicazione di produzione. Di seguito sono riportati i passaggi per la generazione di certificati Java per la comunicazione SSL:

  1. Genera un certificato usando il comando keygen in Windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. Autocertificare il certificato:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Esporta certificato nella cartella:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. Importa certificato nel client Truststore:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


Ciao, ho uno scenario in cui ho due diverse applicazioni all'interno dello stesso contenitore (Tomcat). Da entrambe le applicazioni, devo chiamare gli altri endpoint da entrambi i lati per ciascuna applicazione. Ad esempio, da A a B e da B ad A (A e B sono le due applicazioni). Devo usare il truststore in questo scenario? Come sto usando client di riposo personalizzato che utilizza keystore. Per favore, suggerisci
Deepak,

0

Questi sono i passaggi per creare un Truststore nel tuo computer locale usando Keytool. Passaggi per creare truststore per un URL nel tuo computer locale.

1) Premi l'URL nel browser usando Chrome

2) Controlla l' icona "i" a sinistra dell'URL nella schermata cromata e fai clic su di essa

3) Controlla l' opzione del certificato e fai clic su di essa per aprire una finestra di dialogo

4) controllare la scheda "percorso certificato" per il numero di certificati disponibili per creare il truststore

5) Vai a quello "details" tab -> click"Copy to File" -> Give the path and the name for the certificateche vuoi creare.

6) Verifica se dispone di certificati principali e segui il punto "5" .

7) Dopo aver creato tutti i certificati, apri il Prompt dei comandi e vai al percorso in cui hai creato i certificati.

8) fornire il seguente comando Keytool per aggiungere i certificati e creare un truststore.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Fornire il comando keytool per tutti i certificati e aggiungerli al truststore.

    keytool -list -v -keystore cacerts

-1

keystore memorizza semplicemente le chiavi private, mentre truststore memorizza le chiavi pubbliche. Dovrai generare un certificato Java per la comunicazione SSL. Puoi usare un comando keygen in Windows, questa sarà probabilmente la soluzione più semplice.


Un truststore memorizza i certificati
Marchese di Lorne,

-1

In termini più semplici:

Keystore viene utilizzato per archiviare le credenziali (server o client) mentre truststore viene utilizzato per archiviare altre credenziali (certificati da CA).

Il keystore è necessario quando si configura il lato server su SSL, viene utilizzato per archiviare il certificato di identità del server, che il server presenterà a un client sulla connessione mentre l'installazione dell'archivio di fiducia sul lato client deve contenere per far funzionare la connessione. Se browser per connettersi a qualsiasi sito Web su SSL verifica il certificato presentato dal server rispetto al suo truststore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.