Trust Store vs Key Store - Erstellen mit Keytool

249

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 yesdie 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.?

Toby
quelle
Ich bin mir nicht sicher, was Sie unter "Das bestimmte Zertifikat, das ich importiere, hat nur einen öffentlichen Schlüssel" verstehen: Ist es nur ein öffentlicher Schlüssel (dh kein Zertifikat) oder ein Zertifikat ohne Zertifizierungsstelle?
Bruno
hmmm, nicht sicher. Ich habe aus meinem Browser als PEM-Datei exportiert. Hilft das?
Toby
Wenn es aus dem Browser exportiert wird, handelt es sich wahrscheinlich um ein Zertifikat. Handelt es sich um ein Serverzertifikat (mit einem CN oder subjectAltName, der mit dem Namen eines Servers übereinstimmt)? Handelt es sich um ein CA-Zertifikat (siehe Grundlegende Einschränkungen, dies sollte in Ihrem Browser angezeigt werden können).
Bruno
2
tl; dr: Vertrauensspeicher enthalten öffentliche, vertrauenswürdige Stammzertifikate (CA), während Identitäts- / Schlüsselspeicher private Identitätszertifikate enthalten. In Bezug auf die Dateien sind sie jedoch gleich.
Andrew

Antworten:

346

Die Terminologie ist ein wenig in der Tat verwirrend, aber beide javax.net.ssl.keyStoreund javax.net.ssl.trustStoreverwendet 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 ). Sie keytoolsind nur ein Werkzeug, um verschiedene Vorgänge mit ihnen durchzuführen (Import / Export / Liste / ...).

Die Parameter javax.net.ssl.keyStoreund javax.net.ssl.trustStoresind die Standardparameter, die zum Erstellen von KeyManagers bzw. TrustManagers verwendet werden und dann zum Erstellen eines verwendet werden, SSLContextdas im Wesentlichen die SSL / TLS-Einstellungen enthält, die beim Herstellen einer SSL / TLS-Verbindung über ein SSLSocketFactoryoder ein verwendet werden sollen SSLEngine. Diese Systemeigenschaften sind genau dort, wo die Standardwerte herkommen, die dann von beispielsweise SSLContext.getDefault()selbst verwendet werden SSLSocketFactory.getDefault(). (All dies kann über die API an mehreren Stellen angepasst werden, wenn Sie die Standardwerte und die spezifischen Werte SSLContextfür einen bestimmten Zweck nicht verwenden möchten .)

Der Unterschied zwischen dem KeyManagerund TrustManager(und damit zwischen javax.net.ssl.keyStoreund javax.net.ssl.trustStore) ist wie folgt (zitiert aus dem JSSE-Referenzhandbuch ):

TrustManager: Legt fest, ob den Anmeldeinformationen für die Remote-Authentifizierung (und damit der Verbindung) vertraut werden soll.

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

(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.keyStoreIhre privaten Schlüssel und Zertifikate enthalten, während der Keystore javax.net.ssl.trustStoredie 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).

Bruno
quelle
danke für die antwort, es klärt die dinge ein wenig auf. Ich bin immer noch verwirrt, wenn es um die Verwendung geht. Ich kann einen pk12 pri / pub-Schlüssel (xxx.p12) als Keystore (über -D) verwenden und eine SSL-Verbindung (vertrauenswürdig) erstellen, ohne einen Truststore über - zu erwähnen. D ... na ja.
Toby
57
Sie müssen keinen Truststore angeben, da es einen Standardwert dafür gibt (er wird mit der JRE gebündelt), normalerweise in $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.
Bruno
2
Vielen Dank für nützliche Informationen. In Weblogic gibt es "Identity-Key-Store", in dem das SSL-Zertifikat des Servers gespeichert ist, und "Trust-Key-Store", in dem die SSL-Zertifikate gespeichert sind, denen der Server vertraut. Bin ich also richtig, wenn ich diesen "Identity-Key" sage? -store "ist nichts anderes als ein" Keystore "und" Trust-Key-Store "ist nichts anderes als ein" Truststore "?
Hagrawal
@Bruno sollten wir auch beachten, dass bei einem "jssecacerts" "cacerts" ignoriert wird?
kommradHomer
61

In allgemeiner Verwendung / Zweck oder Laienart zu erklären:

TrustStore : Wie der Name schon sagt, wird er normalerweise zum Speichern der Zertifikate vertrauenswürdiger Entitäten verwendet. Ein Prozess kann einen Speicher mit Zertifikaten aller vertrauenswürdigen Parteien verwalten, denen er vertraut.

keyStore : Dient zum Speichern der Serverschlüssel (sowohl öffentlich als auch privat) zusammen mit dem signierten Zertifikat.

Während des SSL-Handshakes

  1. Ein Client versucht, auf https: // zuzugreifen

  2. Daher antwortet der Server mit einem SSL-Zertifikat (das in seinem keyStore gespeichert ist).

  3. 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?

  4. 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.

Balaji Boggaram Ramanarayan
quelle
25

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.trustStoreSystemeigenschaft 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.

musiKk
quelle
4
Sie können verschiedene Arten von Schlüsselspeichern (z. B. PKCS12) verwenden, indem Sie die Systemeigenschaften javax.net.ssl.keyStoreTypeund festlegen javax.net.ssl.trustStoreType.
Donal Fellows
1
@Donal: Gute Ergänzung. Wissen Sie zufällig, ob es eine Liste aller unterstützten Container gibt? Ich kenne nur PKCS12 und JKS (ersteres ist das Ergebnis von Versuch und Irrtum ...).
musiKk
2
Die Keystore-Formate variieren je nach verfügbaren Anbietern (in dieser Liste finden Sie standardmäßig die mit Oracle JRE gebündelten). Es gab auch eine Diskussion in dieser Frage . Andere Anbieter (z. B. BouncyCastle) können für andere Formate verwendet werden.
Bruno
21

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:

  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. Selbstzertifizierung des Zertifikats:

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 Client Truststore importieren:

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

Akash5288
quelle
Hallo, ich habe ein Szenario, in dem ich zwei verschiedene Anwendungen im selben Container (Tomcat) habe. Von beiden Anwendungen muss ich die restlichen Endpunkte von beiden Seiten zu jeder Anwendung aufrufen. Wie von A nach B und B nach A (A und B sind die beiden Anwendungen). Muss ich in diesem Szenario den Truststore verwenden? Da ich einen benutzerdefinierten Rest-Client verwende, der den Keystore verwendet. Bitte vorschlagen.
Deepak
0

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 certificateSie 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.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Geben Sie den Befehl keytool für alle Zertifikate ein und fügen Sie sie dem Trust Store hinzu.

    keytool -list -v -keystore cacerts
Ganesh Sha
quelle
-1

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.

Team END_TECH
quelle
Ein Truststore speichert vertrauenswürdige Zertifikate.
Marquis von Lorne
-1

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.

Snehal Masne
quelle