wake-up-neo.net

Trust Store vs Key Store - Erstellen mit Keytool

Ich verstehe, dass der Keystore normalerweise private/öffentliche Schlüssel und der Trust Store nur öffentliche Schlüssel enthält (und die Liste der vertrauenswürdigen Parteien darstellt, mit denen Sie kommunizieren möchten). Nun, das ist meine erste Annahme. Wenn das nicht stimmt, habe ich wahrscheinlich nicht sehr gut angefangen.

Ich war jedoch daran interessiert zu verstehen, wie/wann Sie die Läden bei der Verwendung von keytool unterscheiden.

Bisher habe ich einen Keystore mit erstellt

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

dadurch wird meine keystore.ks-Datei erstellt. Ich beantworte yes die Frage, ob ich Bob vertraue, aber es ist mir unklar, ob dies eine Keystore-Datei oder eine Truststore-Datei erstellt hat? Ich kann meine Anwendung so einrichten, dass die Datei als eine von beiden verwendet wird.

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

und mit System.setProperty( "javax.net.debug", "ssl") set kann ich das Zertifikat unter vertrauenswürdigen Zertifizierungen sehen (aber nicht unter dem Keystore-Abschnitt). Das spezielle Zertifikat, das ich importiere, hat nur einen öffentlichen Schlüssel und ich beabsichtige, es zu verwenden, um Daten über eine SSL-Verbindung an Bob zu senden (aber vielleicht bleibt dies am besten für eine andere Frage übrig!).

Hinweise oder Klarstellungen wären sehr dankbar. Ist die Ausgabe von keytool die gleiche, was auch immer Sie importieren, und die Konvention besagt, dass einer ein Keystore und der andere ein Trust Store ist? Wie ist die Beziehung bei der Verwendung von SSL usw.?

230
Toby

Die Terminologie ist in der Tat etwas verwirrend, aber sowohl javax.net.ssl.keyStore Als auch javax.net.ssl.trustStore Werden verwendet, um die zu verwendenden Schlüsselspeicher für zwei verschiedene Zwecke anzugeben. Keystores gibt es in verschiedenen Formaten und sind nicht unbedingt Dateien (siehe diese Frage ), und keytool ist nur ein Werkzeug, um verschiedene Operationen an ihnen durchzuführen (Import/Export/Liste/.. .).

Die Parameter javax.net.ssl.keyStore Und javax.net.ssl.trustStore Sind die Standardparameter, die zum Erstellen von KeyManagers bzw. TrustManagers und anschließend zum Erstellen eines SSLContext verwendet werden. Dies enthält im Wesentlichen die SSL/TLS-Einstellungen, die beim Herstellen einer SSL/TLS-Verbindung über ein SSLSocketFactory oder ein SSLEngine verwendet werden sollen. Diese Systemeigenschaften sind genau dort, woher die Standardwerte kommen, die dann von SSLContext.getDefault() verwendet werden, selbst zum Beispiel von SSLSocketFactory.getDefault(). (All dies kann an mehreren Stellen über die API angepasst werden, wenn Sie die Standardwerte und die spezifischen SSLContexts nicht für einen bestimmten Zweck verwenden möchten.)

Der Unterschied zwischen KeyManager und TrustManager (und damit zwischen javax.net.ssl.keyStore Und javax.net.ssl.trustStore) Ist wie folgt (zitiert aus dem JSSE ref guide ):

TrustManager: Legt fest, ob die Anmeldeinformationen für die Remote-Authentifizierung (und damit die Verbindung) als vertrauenswürdig eingestuft werden sollen.

KeyManager: Legt fest, welche Authentifizierungsdaten an den Remote-Host gesendet werden sollen.

(Andere Parameter sind verfügbar und ihre Standardwerte sind im JSSE-Referenzhandbuch beschrieben. Beachten Sie, dass es zwar einen Standardwert für den Trust Store gibt, aber keinen für den Key Store.)

Im Wesentlichen enthält der Keystore in javax.net.ssl.keyStore Ihre privaten Schlüssel und Zertifikate, während der javax.net.ssl.trustStore Die CA-Zertifikate enthält, denen Sie vertrauen möchten, wenn eine entfernte Partei ihr Zertifikat vorlegt. In einigen Fällen können sie ein und dasselbe Geschäft sein, obwohl es oft besser ist, unterschiedliche Geschäfte zu verwenden (insbesondere wenn sie dateibasiert sind).

316
Bruno

Um es in üblicher Weise zu erklären:

TrustStore: Wie der Name angibt, werden normalerweise die Zertifikate vertrauenswürdiger Entitäten gespeichert. Ein Prozess kann einen Zertifikatsspeicher aller vertrauenswürdigen Parteien verwalten, denen er vertraut.

keyStore: Dient zum Speichern der (öffentlichen und privaten) Serverschlüssel zusammen mit dem signierten Zertifikat.

Während des SSL-Handshakes

  1. Ein Client versucht auf https: // zuzugreifen

  2. Auf diese Weise antwortet der Server mit der Bereitstellung eines SSL-Zertifikats (das in seinem keyStore gespeichert ist).

  3. Jetzt empfängt der Client das SSL-Zertifikat und überprüft es über trustStore (d. H. Der trustStore des Clients verfügt bereits über vordefinierte Zertifikate, denen er vertraut). Es ist wie folgt: Kann ich diesem Server vertrauen? Ist das derselbe Server, mit dem ich zu sprechen versuche? Keine Mittelmann-Angriffe?

  4. Sobald der Client überprüft, ob er mit dem vertrauenswürdigen Server kommuniziert, kann die SSL-Kommunikation über einen gemeinsamen geheimen Schlüssel erfolgen.

Hinweis: Ich spreche hier nicht über Client-Authentifizierung auf der Serverseite. Wenn ein Server auch eine Clientauthentifizierung durchführen möchte, unterhält der Server auch einen TrustStore, um den Client zu überprüfen.

Es gibt keinen Unterschied zwischen Keystore- und Truststore-Dateien. Beides sind Dateien im proprietären JKS-Dateiformat. Die Unterscheidung liegt in der Verwendung: Nach meinem besten Wissen verwendet Java) nur den Speicher, auf den mit javax.net.ssl.trustStore Verwiesen wird, um nach vertrauenswürdigen Zertifikaten zu suchen, wenn SSL-Verbindungen erstellt werden. Gleiches gilt für Schlüssel und javax.net.ssl.keyStore. Theoretisch ist es jedoch in Ordnung, ein und dieselbe Datei für Trust- und Keystores zu verwenden.

23
musiKk

Der Keystore wird von einem Server zum Speichern privater Schlüssel verwendet, und der Truststore wird vom Drittanbieter-Client zum Speichern öffentlicher Schlüssel verwendet, die vom Server für den Zugriff bereitgestellt werden. Das habe ich in meiner Produktionsanwendung getan. Im Folgenden sind die Schritte zum Generieren von Java Zertifikaten für die SSL-Kommunikation aufgeführt:

  1. Generieren Sie ein Zertifikat mit dem Befehl keygen in Windows:

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

  1. Das Zertifikat selbst zertifizieren:

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

  1. Zertifikat in Ordner exportieren:

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

  1. Zertifikat in den Client-Truststore importieren:

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

21
Akash5288