Unterschied zwischen einem Java-Keystore und einem Truststore

Java Top

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs

1. Übersicht

In diesem kurzen Artikel geben wir einen Überblick über die Unterschiede zwischen einem Java-Keystore und einem Java-Truststore.

2. Konzepte

In den meisten Fällen verwenden wir einen Keystore und einen Truststore, wenn unsere Anwendung über SSL / TLS kommunizieren muss .

Normalerweise sind dies kennwortgeschützte Dateien, die sich im selben Dateisystem wie unsere laufende Anwendung befinden. Das für diese Dateien verwendete Standardformat ist JKS bis Java 8 .

Seit Java 9 ist das Standard-Keystore-Format PKCS12 . Der größte Unterschied zwischen JKS und PKCS12 besteht darin, dass JKS ein Java-spezifisches Format ist, während PKCS12 eine standardisierte und sprachneutrale Methode zum Speichern verschlüsselter privater Schlüssel und Zertifikate darstellt.

3. Java KeyStore

Ein Java-Keystore speichert private Schlüsseleinträge, Zertifikate mit öffentlichen Schlüsseln oder nur geheime Schlüssel , die wir für verschiedene kryptografische Zwecke verwenden können. Es wird jeweils durch einen Alias ​​gespeichert, um die Suche zu vereinfachen.

Im Allgemeinen enthalten Keystores Schlüssel, die unsere Anwendung besitzt und mit denen wir die Integrität einer Nachricht und die Authentizität des Absenders nachweisen können, beispielsweise durch Signieren von Nutzdaten.

Normalerweise verwenden wir einen Keystore, wenn wir ein Server sind und HTTPS verwenden möchten . Während eines SSL-Handshakes sucht der Server den privaten Schlüssel im Keystore und präsentiert dem Client den entsprechenden öffentlichen Schlüssel und das entsprechende Zertifikat.

Wenn sich der Client auch selbst authentifizieren muss - eine Situation, die als gegenseitige Authentifizierung bezeichnet wird -, verfügt der Client entsprechend über einen Schlüsselspeicher und legt auch seinen öffentlichen Schlüssel und sein Zertifikat vor.

Es gibt keinen Standard-Keystore. Wenn wir also einen verschlüsselten Kanal verwenden möchten, müssen wir javax.net.ssl.keyStore und javax.net.ssl.keyStorePassword festlegen. Wenn sich unser Keystore-Format vom Standardformat unterscheidet, können wir es mit javax.net.ssl.keyStoreType anpassen.

Natürlich können wir diese Schlüssel auch für andere Zwecke verwenden. Private Schlüssel können Daten signieren oder entschlüsseln, und öffentliche Schlüssel können Daten verifizieren oder verschlüsseln. Geheime Schlüssel können diese Funktionen ebenfalls ausführen. Ein Keystore ist ein Ort, an dem wir diese Schlüssel festhalten können.

Wir können auch programmgesteuert mit dem Keystore interagieren.

4. Java TrustStore

Ein Truststore ist das Gegenteil - während ein Keystore normalerweise Zertifikate enthält, die uns identifizieren, hält ein Truststore Zertifikate, die andere identifizieren.

In Java verwenden wir es, um dem Dritten zu vertrauen, mit dem wir kommunizieren möchten.

Nehmen Sie unser früheres Beispiel. Wenn ein Client über HTTPS mit einem Java-basierten Server kommuniziert, sucht der Server den zugehörigen Schlüssel in seinem Schlüsselspeicher und präsentiert dem Client den öffentlichen Schlüssel und das Zertifikat.

Wir, der Kunde, suchen dann das zugehörige Zertifikat in unserem Truststore. Wenn sich das vom externen Server vorgelegte Zertifikat oder die vom externen Server vorgelegten Zertifizierungsstellen nicht in unserem Truststore befinden, erhalten wir eine SSLHandshakeException und die Verbindung wird nicht erfolgreich hergestellt.

Java hat einen Truststore namens cacerts gebündelt und befindet sich im Verzeichnis $ JAVA_HOME / jre / lib / security .

Es enthält standardmäßige, vertrauenswürdige Zertifizierungsstellen:

$ 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

Wir sehen hier, dass der Truststore 92 vertrauenswürdige Zertifikatseinträge enthält und einer der Einträge der Eintrag verisignclass2gca ist . Dies bedeutet, dass die JVM automatisch Zertifikaten vertraut, die von verisignclass2g2ca signiert wurden .

Hier können wir den Standardspeicherort des Truststores über die Eigenschaft javax.net.ssl.trustStore überschreiben . Ebenso können wir javax.net.ssl.trustStorePassword und javax.net.ssl.trustStoreType festlegen, um das Kennwort und den Typ des Truststores anzugeben.

5. Schlussfolgerung

In diesem Tutorial haben wir die Hauptunterschiede zwischen dem Java-Keystore und dem Java-Truststore sowie deren Zweck erläutert.

Außerdem haben wir gezeigt, wie die Standardeinstellungen mit Systemeigenschaften überschrieben werden können.

Als Nächstes können Sie sich das folgende SSL-Handbuch oder das JSSE-Referenzhandbuch ansehen, um weitere Informationen zur verschlüsselten Kommunikation in Java zu erhalten.

Java unten

Ich habe gerade den neuen Learn Spring- Kurs angekündigt , der sich auf die Grundlagen von Spring 5 und Spring Boot 2 konzentriert:

>> Überprüfen Sie den Kurs