java SSL i magazyn kluczy certyfikatów

165

Skąd mój program java wie, gdzie jest mój magazyn kluczy zawierający certyfikat? Lub alternatywnie, jak wskazać programowi Java, gdzie ma szukać magazynu kluczy?

Po określeniu w jakiś sposób magazynu kluczy, jak określić certyfikat, który będzie używany do uwierzytelniania serwera na kliencie?

deborah
źródło
lepiej unikać używania ustawienia System.setProperty (podejścia poniżej), patrz: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , jak zbudować KeyManagerFactory dla SSLContext
Marek- A -

Odpowiedzi:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
źródło
4
ktoś wie, jak odwołać się do tego w oknie Windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Program Files (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); nie działa dla mnie :(
simgineer
4
W systemie Windows określona nazwa ścieżki musi zawierać ukośniki przednie / zamiast ukośników odwrotnych \.
Droidman
Czy to zadziałało? Użyłem tego samego kodu, w którym mój plik „jks” zawiera certyfikat CA. Ale nadal otrzymuję javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Błąd transportu: 403 Błąd: Niedozwolony błąd, gdy wywołuję kod klienta za pośrednictwem kodów pośredniczących wygenerowanych przez SOAP. Jakieś pomysły?
james2611nov
1
Istnieje również właściwość systemu haseł (javax.net.ssl.trustStorePassword). Może być również przekazany jako argumenty JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword refer docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly
@ james2611nov: Jeśli otrzymujesz błąd HTTP 403 (lub inną odpowiedź HTTP) wywołującą punkt końcowy HTTPS, oznacza to, że pomyślnie przeszedłeś konfigurację TLS: interakcje HTTP mają miejsce tylko po skonfigurowaniu kanału TLS ( inaczej nie mogliby być chronieni). Więc - tak, ta odpowiedź najwyraźniej zadziałała dla ciebie. :-)
ruakh
295

Właściwości SSL są ustawiane na poziomie maszyny JVM za pośrednictwem właściwości systemowych. Oznacza to, że możesz je ustawić podczas uruchamiania programu (java -D ....) lub możesz ustawić je w kodzie, wykonując System.setProperty.

Konkretne klucze, które musisz ustawić, znajdują się poniżej:

javax.net.ssl.keyStore - lokalizacja pliku kluczy Java zawierającego certyfikat i klucz prywatny procesu aplikacji. W systemie Windows określona nazwa ścieżki musi zawierać ukośniki / zamiast ukośników odwrotnych.

javax.net.ssl.keyStorePassword - hasło umożliwiające dostęp do klucza prywatnego z pliku kluczy określonego przez javax.net.ssl.keyStore. To hasło jest używane dwukrotnie: aby odblokować plik magazynu kluczy (hasło przechowywania) i odszyfrować klucz prywatny przechowywany w magazynie kluczy (hasło klucza).

javax.net.ssl.trustStore - lokalizacja pliku kluczy Java zawierającego zbiór certyfikatów CA zaufanych przez ten proces aplikacji (magazyn zaufanych certyfikatów). W systemie Windows określona nazwa ścieżki musi zawierać prawe ukośniki /zamiast odwrotnych ukośników \.

Jeśli lokalizacja zaufanych certyfikatów nie zostanie określona za pomocą tej właściwości, implementacja SunJSSE wyszukuje i używa pliku kluczy w następujących lokalizacjach (w kolejności):

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

javax.net.ssl.trustStorePassword - hasło do odblokowania pliku kluczy (hasło magazynu) określonego przez javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (opcjonalne) W przypadku formatu pliku kluczy Java ta właściwość ma wartość jks (lub JKS). Zwykle nie określa się tej właściwości, ponieważ jej wartość domyślna to już jks.

javax.net.debug - aby włączyć rejestrowanie dla warstwy SSL / TLS, ustaw tę właściwość na ssl.

Karthik Ramachandran
źródło
17
Bardziej stosowne byłoby dodanie linku do dokumentu, z którego to cytat. Myślę, że to jest to: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno,
4
Oficjalnym dokumentem powinien być JSSE Reference Guide: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/ ...
aleung
4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/... jest teraz bardziej odpowiedni.
Rick-777
11
Dla każdego, kto chce edytować magazyn zaufanych certyfikatów systemu, domyślne hasło to „changeit”: community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 dla właściwości javax.net.ssl.trustStorePassword. Rozejrzałem się przez chwilę i to był pierwszy, który o tym wspomniał.
jgreen
22

Tylko słowo ostrzeżenia. Jeśli próbujesz otworzyć istniejący magazyn kluczy JKS w Javie 9 i nowszych, musisz wspomnieć również o następujących właściwościach z wartością „JKS”:

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

Powodem jest to, że domyślny typ magazynu kluczy określony w pliku java.security został zmieniony na pkcs12 z jks od wersji Java 9.

Sankar Natarajan
źródło
11

Przede wszystkim istnieją dwa rodzaje magazynów kluczy.

Indywidualne i ogólne

Aplikacja użyje tego wskazanego podczas uruchamiania lub domyślnego systemu.

Będzie to inny folder, jeśli uruchomione jest środowisko JRE lub JDK lub jeśli zaznaczysz folder osobisty lub „globalny”.

Są też zaszyfrowane

Krótko mówiąc, ścieżka będzie wyglądać następująco:

$JAVA_HOME/lib/security/cacerts dla „ogólnego”, który ma wszystkie CA dla organów i jest dość ważny.

Carlos Garcia
źródło
Typy to „keystore” i „truststore”. Proszę nie wymyślać zbędnej terminologii.
Markiz Lorne
9

możesz również wspomnieć o ścieżce w czasie wykonywania, używając -Dwłaściwości jak poniżej

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

W mojej aplikacji Apache Spark udostępniłem ścieżkę certyfikatów i magazynu kluczy za pomocą --confopcji oraz extraJavaoptionsw funkcji przesyłania iskier, jak poniżej

--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
źródło