Keystore-Typ: Welcher soll verwendet werden?

114

Wenn ich java.securitymir die Datei von my JREansehe, sehe ich, dass der standardmäßig zu verwendende Keystore-Typ auf eingestellt ist JKS. Hier gibt es eine Liste der Keystore-Typen, die verwendet werden können.

Gibt es einen empfohlenen Keystore-Typ? Was sind die Vor- und Nachteile der verschiedenen Keystore-Typen?

Mickael Marrache
quelle
4
Seit Java 9 ist PKCS12 der Standard-Keystore-Typ. Diese Änderung betrifft das Ziel von JEP 229: "Verbessern Sie die Sicherheit. PKCS12 bietet stärkere kryptografische Algorithmen als JKS." Weitere Informationen finden Sie unter "JEP 229: Standardmäßig PKCS12-Schlüsselspeicher erstellen", openjdk.java.net/jeps/229 ; Letzter Zugriff 2. Februar 2018.
Buzz3791

Antworten:

141

Es gibt ein paar mehr Typen als in der Standardnamenliste aufgeführt, mit der Sie verknüpft sind. Weitere Informationen finden Sie in der Dokumentation zu kryptografischen Anbietern . Die häufigsten sind sicherlich JKS(die Standardeinstellung) und PKCS12(für PKCS # 12-Dateien, oft mit Erweiterung .p12oder manchmal .pfx).

JKS ist am häufigsten, wenn Sie in der Java-Welt bleiben. PKCS # 12 ist nicht Java-spezifisch. Es ist besonders praktisch, Zertifikate (mit privaten Schlüsseln) zu verwenden, die von einem Browser gesichert wurden oder von OpenSSL-basierten Tools stammen ( keytoolein Schlüsselspeicher konnte nicht konvertiert und seine privaten Schlüssel vor Java 6 importiert werden) , also musste man andere Werkzeuge verwenden).

Wenn Sie bereits eine PKCS # 12-Datei haben, ist es oft einfacher, den PKCS12Typ direkt zu verwenden. Es ist möglich, Formate zu konvertieren, aber es ist selten erforderlich, wenn Sie den Keystore-Typ direkt auswählen können.

In Java 7 PKCS12war es hauptsächlich als Keystore nützlich, aber weniger als Truststore (siehe den Unterschied zwischen einem Keystore und einem Truststore ), da Sie Zertifikatseinträge ohne einen privaten Schlüssel nicht speichern konnten. Im Gegensatz dazu JKSmuss nicht jeder Eintrag ein privater Schlüsseleintrag sein, sodass Sie Einträge haben können, die nur Zertifikate enthalten. Dies ist nützlich für Trust Stores, in denen Sie die Liste der Zertifikate speichern, denen Sie vertrauen (aber Sie haben keine privater Schlüssel für sie).

Dies hat sich in Java 8 geändert, sodass Sie jetzt auch Einträge nur für Zertifikate in PKCS12Geschäften haben können. (Weitere Details zu diesen Änderungen und weiteren Plänen finden Sie in JEP 229: Standardmäßig PKCS12-Keystores erstellen .)

Es gibt einige andere Keystore-Typen, die möglicherweise (je nach Kontext) weniger häufig verwendet werden. Dazu gehören:

  • PKCS11Für PKCS # 11-Bibliotheken, normalerweise für den Zugriff auf kryptografische Hardware-Token. Die Sun-Provider-Implementierung unterstützt jedoch auch NSS-Stores (von Mozilla).
  • BKSmit dem BouncyCastle-Anbieter (häufig für Android verwendet).
  • Windows-MY/ Windows-ROOT, wenn Sie direkt auf den Windows-Zertifikatspeicher zugreifen möchten.
  • KeychainStore, wenn Sie den OSX-Schlüsselbund direkt verwenden möchten.
Bruno
quelle
7
@husayt, PEM-Zertifikate werden nicht direkt als Keystore-Typen unterstützt (ich nehme an, man könnte eine entsprechende KeyStoreImplementierung schreiben ). Sie können sie jedoch im laufenden Betrieb mit einer CertificateFactory(wie in dieser Antwort gezeigt ) in eine Keystore-Instanz (normalerweise JKS, der Standardtyp) im Speicher laden .
Bruno
Ich denke, das JKShat sich geändert zuJCEKS
Amphibient
5
Eher kritisch kann ein JKS-Schlüsselspeicher keine geheimen Schlüssel speichern. Für diesen Anwendungsfall ist JCEKS geeignet. Es kann erwähnenswert sein, dies in Ihrer Antwort zu erwähnen.
Duncan Jones
1
OK. In Java 8 kann ich problemlos einen PKCS # 12-Keystore mit einem einzigen Zertifikat erstellen. Beachten Sie, dass für P12-Zertifikatseinträge implizit vertrauenswürdig sind. Wenn Sie nicht vertrauenswürdige Zertifikate benötigen, müssen Sie möglicherweise zu einem Schema mit mehreren Schlüsselspeichern zurückkehren.
Maarten Bodewes
2
OK, zumindest für Java 8 PKCS # 12 können Schlüsselspeicher immer noch keine geheimen Schlüsseleinträge speichern . Beim Speichern eines solchen Schlüsselspeichers (ugh) wird eine Nullzeigerausnahme angezeigt, wahrscheinlich weil keine zugehörigen Zertifikate gefunden werden können. Jemand hat anscheinend die Lehren von Joshua über Fail-Fast-Code übersprungen.
Maarten Bodewes
21

In diesem Beitrag werden verschiedene Arten von Keystores in Java und die Unterschiede zwischen verschiedenen Arten von Keystores vorgestellt. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java----Overview

Nachfolgend finden Sie die Beschreibungen der verschiedenen Schlüsselspeicher aus dem Beitrag:

JKS, Java Key Store. Sie finden diese Datei unter sun.security.provider.JavaKeyStore. Dieser Keystore ist Java-spezifisch und hat normalerweise eine Erweiterung von jks. Diese Art von Schlüsselspeicher kann private Schlüssel und Zertifikate enthalten, jedoch nicht zum Speichern geheimer Schlüssel. Da es sich um einen Java-spezifischen Keystore handelt, kann er nicht in anderen Programmiersprachen verwendet werden.

JCEKS, JCE-Schlüsselspeicher. Sie finden diese Datei unter com.sun.crypto.provider.JceKeyStore. Dieser Keystore hat eine Erweiterung von jceks. Die Einträge, die in den JCEKS-Keystore gestellt werden können, sind private Schlüssel, geheime Schlüssel und Zertifikate.

PKCS12, dies ist ein Standard-Keystore-Typ, der in Java und anderen Sprachen verwendet werden kann. Sie finden diese Keystore-Implementierung unter sun.security.pkcs12.PKCS12KeyStore. Es hat normalerweise eine Erweiterung von p12 oder pfx. Sie können private Schlüssel, geheime Schlüssel und Zertifikate für diesen Typ speichern.

PKCS11, dies ist ein Hardware-Keystore-Typ. Es dient als Schnittstelle für die Java-Bibliothek zur Verbindung mit Hardware-Keystore-Geräten wie Luna, nCipher. Sie finden diese Implementierung unter sun.security.pkcs11.P11KeyStore. Wenn Sie den Keystore laden, müssen Sie keinen bestimmten Anbieter mit einer bestimmten Konfiguration erstellen. In diesem Schlüsselspeicher können private Schlüssel, geheime Schlüssel und Zertifikate gespeichert werden. Beim Laden des Schlüsselspeichers werden die Einträge aus dem Schlüsselspeicher abgerufen und dann in Softwareeinträge konvertiert.

PixelsTech
quelle
@ peci1 Ich habe geplant, einige Tutorials zur Verwendung dieser Keystores zu schreiben. Bisher habe ich einen Beitrag für JKS geschrieben, bitte finden Sie ihn auf pixelstech.net/article/…
PixelsTech
@ PixelTech Ich habe dieses gefunden und mich gefragt, wo der Rest von ihnen ist :) Also werde ich dran bleiben;) Danke
Martin Pecka
1
@ peci1 Ich habe heute JCEKS und PKCS12 behandelt. Für PKCS11 sind Hardware und zusätzliche Konfiguration erforderlich. Sie benötigen mehr Zeit, um es zu erstellen. pixelstech.net/article/… und pixelstech.net/article/…
PixelsTech
Wow, das ist blitzschnell! Vielen Dank.
Martin Pecka
4

Wenn Sie Java 8 oder höher verwenden, sollten Sie auf jeden Fall PKCS12die Standardeinstellung seit Java 9 ( JEP 229 ) wählen .

Die Vorteile gegenüber JKSund JCEKSsind:

  • Geheime Schlüssel, private Schlüssel und Zertifikate können gespeichert werden
  • PKCS12ist ein Standardformat, es kann von anderen Programmen und Bibliotheken gelesen werden 1
  • Verbesserte Sicherheit: JKSund JCEKSsind ziemlich unsicher. Dies lässt sich an der Anzahl der Tools zum brutalen Erzwingen von Kennwörtern dieser Keystore-Typen ablesen, die besonders bei Android-Entwicklern beliebt sind. 2, 3

1 Es gibt JDK-8202837 , das in Java 11 behoben wurde

2 Die Iterationszahl für PBE, die von allen Keystore-Typen (einschließlich PKCS12) verwendet wurde, war früher eher wöchentlich ( CVE-2017-10356 ), wurde jedoch in 9.0.1, 8u151, 7u161 und 6u171 behoben

3 Zur weiteren Lektüre:

Marcono1234
quelle