Tipo di archivio chiavi: quale usare?


115

Guardando il file java.securitydi my JRE, vedo che il tipo di keystore da utilizzare di default è impostato su JKS. Qui c'è un elenco dei tipi di keystore che possono essere utilizzati.

Esiste un tipo di archivio chiavi consigliato? Quali sono i pro / contro dei diversi tipi di keystore?


4
A partire da Java 9, PKCS12 è il tipo di archivio chiavi predefinito. Questa modifica riguarda l'obiettivo JEP 229: "Migliorare la sicurezza. PKCS12 offre algoritmi crittografici più potenti di JKS". Per maggiori informazioni vedere "JEP 229: creare keystore PKCS12 per impostazione predefinita", openjdk.java.net/jeps/229 ; ultimo accesso 2 febbraio 2018
buzz3791

Risposte:


142

Esistono alcuni tipi in più rispetto a quelli elencati nell'elenco dei nomi standard a cui ti sei collegato. Puoi trovare ulteriori informazioni nella documentazione dei provider di crittografia . I più comuni sono sicuramente JKS(l'impostazione predefinita) e PKCS12(per i file PKCS # 12, spesso con estensione .p12o talvolta .pfx).

JKS è il più comune se rimani nel mondo Java. PKCS # 12 non è specifico per Java, è particolarmente conveniente utilizzare certificati (con chiavi private) di cui è stato eseguito il backup da un browser o provenienti da strumenti basati su OpenSSL ( keytoolnon è stato possibile convertire un keystore e importare le sue chiavi private prima di Java 6 , quindi dovevi usare altri strumenti).

Se hai già un file PKCS # 12, spesso è più facile usare PKCS12direttamente il tipo. È possibile convertire i formati, ma raramente è necessario se puoi scegliere direttamente il tipo di keystore.

In Java 7, PKCS12era principalmente utile come keystore ma meno per un truststore (vedere la differenza tra un keystore e un truststore ), perché non era possibile memorizzare le voci del certificato senza una chiave privata. Al contrario, JKSnon richiede che ogni voce sia una voce di chiave privata, quindi puoi avere voci che contengono solo certificati, il che è utile per i truststore, dove archivi l'elenco dei certificati di cui ti fidi (ma non hai il chiave privata per loro).

Questo è cambiato in Java 8, quindi ora puoi avere voci di solo certificato anche nei PKCS12negozi. (Maggiori dettagli su queste modifiche e ulteriori piani possono essere trovati in JEP 229: Crea keystore PKCS12 per impostazione predefinita .)

Esistono alcuni altri tipi di keystore, forse usati meno frequentemente (a seconda del contesto), quelli includono:

  • PKCS11, per le librerie PKCS # 11, tipicamente per l'accesso ai token di crittografia hardware, ma l'implementazione del provider Sun supporta anche gli archivi NSS (da Mozilla) attraverso questo.
  • BKS, utilizzando il provider BouncyCastle (comunemente utilizzato per Android).
  • Windows-MY/ Windows-ROOT, se desideri accedere direttamente all'archivio certificati di Windows.
  • KeychainStore, se desideri utilizzare direttamente il portachiavi OSX.

7
@husayt, i certificati PEM non sono supportati direttamente come tipi di keystore (suppongo che si possa scrivere KeyStoreun'implementazione in tal senso). È tuttavia possibile caricarli al volo in un'istanza del keystore (in genere JKS, il tipo predefinito) in memoria utilizzando un CertificateFactory(come mostrato in questa risposta ).
Bruno

Penso che JKSsia cambiato inJCEKS
amphibient

5
In modo piuttosto critico, un archivio chiavi JKS non può memorizzare chiavi segrete. Per questo caso d'uso, JCEKS è appropriato. Potrebbe valere la pena menzionarlo nella tua risposta.
Duncan Jones

1
Ok. In Java 8 posso creare un keystore PKCS # 12 con un singolo certificato senza alcun problema. Si noti che per le voci di certificato P12 sono implicitamente attendibili. Se hai bisogno di certificati non attendibili, potresti dover tornare a uno schema con più archivi di chiavi.
Maarten Bodewes

2
OK almeno per gli archivi di chiavi PKCS # 12 di Java 8 ancora non è possibile memorizzare le voci della chiave segreta . Otterrai un'eccezione del puntatore nullo quando memorizzi un tale archivio di chiavi (ugh), probabilmente perché non riesce a trovare i certificati associati. Qualcuno apparentemente ha saltato gli insegnamenti di Joshua sul codice fail fast.
Maarten Bodewes

22

Ecco un post che introduce diversi tipi di keystore in Java e le differenze tra i diversi tipi di keystore. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Di seguito sono riportate le descrizioni dei diversi keystore del post:

JKS, Java Key Store. È possibile trovare questo file in sun.security.provider.JavaKeyStore. Questo keystore è specifico per Java, di solito ha un'estensione di jks. Questo tipo di keystore può contenere chiavi private e certificati, ma non può essere utilizzato per memorizzare chiavi segrete. Poiché è un keystore specifico per Java, non può essere utilizzato in altri linguaggi di programmazione.

JCEKS, archivio chiavi JCE. Puoi trovare questo file su com.sun.crypto.provider.JceKeyStore. Questo keystore ha un'estensione di jceks. Le voci che possono essere inserite nel keystore JCEKS sono chiavi private, chiavi segrete e certificati.

PKCS12, questo è un tipo di archivio chiavi standard che può essere utilizzato in Java e in altri linguaggi. È possibile trovare questa implementazione del keystore su sun.security.pkcs12.PKCS12KeyStore. Di solito ha un'estensione di p12 o pfx. È possibile memorizzare chiavi private, chiavi segrete e certificati su questo tipo.

PKCS11, questo è un tipo di archivio chiavi hardware. Serve un'interfaccia per la libreria Java per connettersi con dispositivi keystore hardware come Luna, nCipher. È possibile trovare questa implementazione su sun.security.pkcs11.P11KeyStore. Quando si carica il keystore, non è necessario creare un provider specifico con una configurazione specifica. Questo keystore può memorizzare chiavi private, chiavi segrete e cetrificate. Quando si carica il keystore, le voci verranno recuperate dal keystore e quindi convertite in voci software.


@ peci1 Ho pianificato di scrivere alcuni tutorial su come utilizzare questi keystore. Finora ho scritto un post per JKS, per favore trovalo
PixelsTech

@PixelsTech Ho trovato questo e mi chiedevo dove fossero gli altri :) Quindi rimarrò sintonizzato;) Grazie
Martin Pecka

1
@ peci1 Ho coperto JCEKS e PKCS12 oggi. Per PKCS11, implica hardware e configurazione aggiuntiva, è necessario più tempo per comporlo. pixelstech.net/article/… e pixelstech.net/article/…
PixelsTech

Wow, è una velocità fulminea! Grazie mille.
Martin Pecka

5

Se stai usando Java 8 o più recente dovresti assolutamente scegliere PKCS12, l'impostazione predefinita da Java 9 ( JEP 229 ).

I vantaggi rispetto a JKSe JCEKSsono:

  • È possibile memorizzare chiavi segrete, chiavi private e certificati
  • PKCS12è un formato standard, può essere letto da altri programmi e librerie 1
  • Sicurezza migliorata: JKSe JCEKSsono piuttosto insicuri. Ciò può essere visto dal numero di strumenti per la forzatura bruta delle password di questi tipi di keystore, particolarmente popolari tra gli sviluppatori Android. 2, 3

1 C'è JDK-8202837 , che è stato corretto in Java 11

2 Il conteggio delle iterazioni per PBE utilizzato da tutti i tipi di keystore (incluso PKCS12) era piuttosto settimanale ( CVE-2017-10356 ), tuttavia è stato corretto in 9.0.1, 8u151, 7u161 e 6u171

3 Per ulteriori letture:

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.