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 Geschäfte 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 Datei keystore.ks erstellt. Ich beantworte yes
die Frage, ob ich Bob vertraue, aber es ist mir unklar, ob dadurch eine Keystore-Datei oder eine Truststore-Datei erstellt wurde. Ich kann meine Anwendung so einrichten, dass sie die Datei auch als solche verwendet.
-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 im Abschnitt Keystore). Das bestimmte Zertifikat, das ich importiere, hat nur einen öffentlichen Schlüssel und ich beabsichtige, ihn zum Senden von Daten über eine SSL-Verbindung an Bob zu verwenden (aber vielleicht bleibt das für eine andere Frage am besten!).
Hinweise oder Klarstellungen wären sehr dankbar. Ist die Ausgabe von Keytool dieselbe, was auch immer Sie importieren, und die gerechte Konvention besagt, dass einer ein Keystore und der andere ein Trust Store ist? Wie ist die Beziehung bei der Verwendung von SSL usw.?
Antworten:
Die Terminologie ist ein wenig in der Tat verwirrend, aber beide
javax.net.ssl.keyStore
undjavax.net.ssl.trustStore
verwendet werden , welche Schlüsselspeicher zu verwenden , um anzugeben, für zwei verschiedene Zwecke. Keystores gibt es in verschiedenen Formaten und sind nicht unbedingt Dateien (siehe diese Frage ). Siekeytool
sind nur ein Werkzeug, um verschiedene Vorgänge mit ihnen durchzuführen (Import / Export / Liste / ...).Die Parameter
javax.net.ssl.keyStore
undjavax.net.ssl.trustStore
sind die Standardparameter, die zum Erstellen vonKeyManager
s bzw.TrustManager
s verwendet werden und dann zum Erstellen eines verwendet werden,SSLContext
das im Wesentlichen die SSL / TLS-Einstellungen enthält, die beim Herstellen einer SSL / TLS-Verbindung über einSSLSocketFactory
oder ein verwendet werden sollenSSLEngine
. Diese Systemeigenschaften sind genau dort, wo die Standardwerte herkommen, die dann von beispielsweiseSSLContext.getDefault()
selbst verwendet werdenSSLSocketFactory.getDefault()
. (All dies kann über die API an mehreren Stellen angepasst werden, wenn Sie die Standardwerte und die spezifischen WerteSSLContext
für einen bestimmten Zweck nicht verwenden möchten .)Der Unterschied zwischen dem
KeyManager
undTrustManager
(und damit zwischenjavax.net.ssl.keyStore
undjavax.net.ssl.trustStore
) ist wie folgt (zitiert aus dem JSSE-Referenzhandbuch ):(Andere Parameter sind verfügbar und ihre Standardwerte werden im JSSE-Referenzhandbuch beschrieben . Beachten Sie, dass es zwar einen Standardwert für den Vertrauensspeicher gibt, jedoch keinen für den Schlüsselspeicher.)
Im Wesentlichen soll der Keystore in
javax.net.ssl.keyStore
Ihre privaten Schlüssel und Zertifikate enthalten, während der Keystorejavax.net.ssl.trustStore
die CA-Zertifikate enthalten soll, denen Sie vertrauen möchten, wenn eine Remote-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).quelle
$JAVA_HOME/lib/security/cacerts
(siehe 2. JSSE-Referenzhandbuch, den ich gesendet habe). Wie Browser enthält es einen Standardsatz vertrauenswürdiger CA-Zertifikate. Im Allgemeinen verwendet ein Client immer einen Truststore, um das Serverzertifikat zu überprüfen. Der Keystore wird jedoch nur verwendet, wenn der Server ein Clientzertifikat anfordert, und der Server verwendet immer einen Keystore für seinen eigenen Schlüssel + Zertifikat, der Truststore jedoch nur Wird verwendet, wenn der Client ein Client-Zertifikat sendet.In allgemeiner Verwendung / Zweck oder Laienart zu erklären:
Während des SSL-Handshakes
Ein Client versucht, auf https: // zuzugreifen
Daher antwortet der Server mit einem SSL-Zertifikat (das in seinem keyStore gespeichert ist).
Jetzt empfängt der Client das SSL-Zertifikat und überprüft es über den TrustStore (dh der TrustStore des Clients verfügt bereits über einen vordefinierten Satz von Zertifikaten, denen er vertraut.). Es ist wie: Kann ich diesem Server vertrauen? Ist dies derselbe Server, mit dem ich zu sprechen versuche? Keine Mittelmannangriffe?
Sobald der Client überprüft, ob er mit dem Server kommuniziert, dem er vertraut, kann die SSL-Kommunikation über einen gemeinsam genutzten geheimen Schlüssel erfolgen.
Hinweis: Ich spreche hier nichts über die Clientauthentifizierung 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.
quelle
Es gibt keinen Unterschied zwischen Keystore- und Truststore-Dateien. Beide sind Dateien im proprietären JKS-Dateiformat. Der Unterschied liegt in der Verwendung: Nach meinem besten Wissen verwendet Java nur den Speicher, auf den die
-Djavax.net.ssl.trustStore
Systemeigenschaft verweist , um beim Erstellen von SSL-Verbindungen nach vertrauenswürdigen Zertifikaten zu suchen. Gleiches gilt für Schlüssel und-Djavax.net.ssl.keyStore
. Theoretisch ist es jedoch in Ordnung, ein und dieselbe Datei für Vertrauens- und Schlüsselspeicher zu verwenden.quelle
javax.net.ssl.keyStoreType
und festlegenjavax.net.ssl.trustStoreType
.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 gemacht. Im Folgenden finden Sie die Schritte zum Generieren von Java-Zertifikaten für die SSL-Kommunikation:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
quelle
Dies sind die Schritte zum Erstellen eines Truststores auf Ihrem lokalen Computer mit Keytool. Schritte zum Erstellen eines Truststores für eine URL auf Ihrem lokalen Computer.
1) Klicken Sie mit Chrome auf die URL im Browser
2) Suchen Sie im Chrome nach dem Symbol "i" links neben der URL und klicken Sie darauf
3) Überprüfen Sie die Zertifikatoption und klicken Sie darauf. Ein Dialogfeld wird geöffnet
4) Überprüfen Sie auf der Registerkarte "Zertifikatspfad" die Anzahl der verfügbaren Zertifikate, um den Truststore zu erstellen
5) Gehen
"details" tab -> click"Copy to File" -> Give the path and the name for the certificate
Sie zu dem, den Sie erstellen möchten.6) Überprüfen Sie, ob übergeordnete Zertifikate vorhanden sind, und befolgen Sie den Punkt "5" .
7) Nachdem alle Zertifikate erstellt wurden, öffnen Sie die Eingabeaufforderung und navigieren Sie zu dem Pfad, in dem Sie die Zertifikate erstellt haben.
8) Geben Sie den folgenden Keytool-Befehl ein, um die Zertifikate hinzuzufügen und einen Truststore zu erstellen.
9) Geben Sie den Befehl keytool für alle Zertifikate ein und fügen Sie sie dem Trust Store hinzu.
quelle
Der Keystore speichert einfach private Schlüssel, während der Truststore öffentliche Schlüssel speichert. Sie möchten ein Java-Zertifikat für die SSL-Kommunikation generieren. Sie können einen keygen-Befehl in Windows verwenden. Dies ist wahrscheinlich die einfachste Lösung.
quelle
In einfachsten Worten:
Der Keystore wird zum Speichern Ihrer Anmeldeinformationen (Server oder Client) verwendet, während der Truststore zum Speichern anderer Anmeldeinformationen (Zertifikate von CA) verwendet wird.
Der Keystore wird benötigt, wenn Sie die Serverseite unter SSL einrichten. Er wird zum Speichern des Serveridentitätszertifikats verwendet, das einem Client in der Verbindung angezeigt wird, während das Trust Store-Setup auf der Clientseite enthalten sein muss, damit die Verbindung funktioniert. Wenn Sie mit dem Browser eine Verbindung zu einer Website über SSL herstellen, wird das vom Server vorgelegte Zertifikat anhand seines Truststores überprüft.
quelle