Java SSL und Cert Keystore

165

Woher weiß mein Java-Programm, wo sich mein Keystore mit dem Zertifikat befindet? Oder wie kann ich meinem Java-Programm mitteilen, wo nach dem Keystore gesucht werden soll?

Wie kann nach Angabe des Schlüsselspeichers das Zertifikat angegeben werden, das zur Authentifizierung des Servers gegenüber dem Client verwendet werden soll?

Deborah
quelle
Besser ist es, die Verwendung der System.setProperty-Einstellung (die folgenden Ansätze) zu vermeiden. Weitere Informationen finden Sie unter: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , Erstellen der KeyManagerFactory für SSLContext
Marek- A -

Antworten:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
quelle
4
weiß jemand, wie man dies auf einer Windows-Box referenziert? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Programme (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); funktioniert nicht für mich :(
Simgineer
4
Unter Windows muss der angegebene Pfadname Schrägstriche / anstelle von Backslashes \ verwenden.
Droidman
Hat das funktioniert? Ich habe denselben Code verwendet, in dem meine 'jks'-Datei ein CA-Zertifikat enthält. Aber ich bekomme immer noch javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Transportfehler: 403 Fehler: Verbotener Fehler, wenn ich den Clientcode über die SOAP-generierten Stubs aufrufe. Irgendwelche Ideen?
James2611nov
1
Es gibt auch eine Kennwortsystemeigenschaft (javax.net.ssl.trustStorePassword). Könnte auch als JVM-Argumente übergeben werden -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Siehe docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly
@ james2611nov: Wenn Sie einen HTTP 403-Fehler (oder eine andere HTTP-Antwort) erhalten, der einen HTTPS-Endpunkt aufruft, bedeutet dies, dass Sie das TLS-Setup erfolgreich abgeschlossen haben: Die HTTP-Interaktionen finden erst statt, sobald der TLS-Kanal eingerichtet ist ( sonst könnten sie nicht geschützt werden). Also - ja, diese Antwort hat anscheinend für Sie funktioniert. :-)
Ruakh
295

SSL-Eigenschaften werden auf JVM-Ebene über Systemeigenschaften festgelegt. Das heißt, Sie können sie entweder festlegen, wenn Sie das Programm ausführen (java -D ....), oder Sie können sie in Code festlegen, indem Sie System.setProperty ausführen.

Die spezifischen Schlüssel, die Sie einstellen müssen, sind unten:

javax.net.ssl.keyStore - Speicherort der Java-Keystore-Datei, die das Zertifikat und den privaten Schlüssel eines Anwendungsprozesses enthält. Unter Windows muss der angegebene Pfadname anstelle von umgekehrten Schrägstrichen / Schrägstriche / verwenden.

javax.net.ssl.keyStorePassword - Kennwort für den Zugriff auf den privaten Schlüssel aus der von javax.net.ssl.keyStore angegebenen Keystore-Datei. Dieses Kennwort wird zweimal verwendet: Zum Entsperren der Keystore-Datei (Speicherkennwort) und zum Entschlüsseln des im Schlüsselspeicher gespeicherten privaten Schlüssels (Schlüsselkennwort).

javax.net.ssl.trustStore - Speicherort der Java-Keystore-Datei, die die Sammlung von CA-Zertifikaten enthält, denen dieser Anwendungsprozess vertraut (Trust Store). Unter Windows muss der angegebene Pfadname Schrägstriche /anstelle von Schrägstrichen verwenden \.

Wenn mit dieser Eigenschaft kein Trust Store-Speicherort angegeben wird, sucht und verwendet die SunJSSE-Implementierung eine Keystore-Datei an den folgenden Speicherorten (in der angegebenen Reihenfolge):

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword - Kennwort zum Entsperren der von angegebenen Speicherartendatei (Speicherkennwort) javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Optional) Für das Java-Keystore-Dateiformat hat diese Eigenschaft den Wert jks (oder JKS). Normalerweise geben Sie diese Eigenschaft nicht an, da der Standardwert bereits jks ist.

javax.net.debug - Um die Protokollierung für die SSL / TLS-Schicht zu aktivieren, setzen Sie diese Eigenschaft auf ssl.

Karthik Ramachandran
quelle
17
Es wäre angemessener, auf das Dokument zu verweisen, aus dem dies zitiert wird. Ich denke, das ist es: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno
4
Das offizielle Dokument sollte das JSSE-Referenzhandbuch sein: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung
4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… ist jetzt besser geeignet.
Rick-777
11
Für alle, die den System Trust Store bearbeiten möchten, lautet das Standardkennwort "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 für die javax.net.ssl.trustStorePassword-Requisite. Ich hatte mich eine Weile umgesehen und dies war das erste, das es erwähnte.
Jgreen
22

Nur ein Wort der Vorsicht. Wenn Sie versuchen, einen vorhandenen JKS-Keystore ab Java 9 zu öffnen, müssen Sie auch die folgenden Eigenschaften mit dem Wert "JKS" angeben:

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

Der Grund dafür ist, dass der in der Datei java.security vorgeschriebene Standard-Keystore-Typ von jks ab Java 9 in pkcs12 geändert wurde.

Sankar Natarajan
quelle
11

Zunächst gibt es zwei Arten von Keystores.

Individuell und allgemein

Die Anwendung verwendet die beim Start angegebene oder die Standardeinstellung des Systems.

Es wird ein anderer Ordner sein, wenn JRE oder JDK ausgeführt wird oder wenn Sie den persönlichen oder den "globalen" Ordner überprüfen.

Sie sind auch verschlüsselt

Kurz gesagt, der Pfad wird wie folgt aussehen:

$JAVA_HOME/lib/security/cacerts für den "allgemeinen", der alle CA für die Behörden hat und ziemlich wichtig ist.

Carlos Garcia
quelle
Die Typen sind "Keystore" und "Truststore". Bitte erfinden Sie keine redundante Terminologie.
Marquis von Lorne
9

Sie können den Pfad auch zur Laufzeit mithilfe der folgenden -DEigenschaften angeben

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

In meiner Apache-Spark-Anwendung habe ich den Pfad von Zertifikaten und Keystore mithilfe der --confOption und extraJavaoptionsin Spark- Submit wie unten angegeben angegeben

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Balakumaran Muralidharan
quelle