keystore java SSL e cert


165

Come fa il mio programma Java a sapere dove si trova il mio keystore contenente il certificato? O in alternativa come posso dire al mio programma Java dove cercare il keystore?

Dopo aver specificato il keystore in qualche modo, come specificare il certificato da utilizzare per autenticare il server sul client?


meglio evitare l'uso dell'impostazione System.setProperty (gli approcci seguenti), vedere: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , come costruire KeyManagerFactory per SSLContext
Marek- A-

Risposte:


111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

4
qualcuno sa come fare riferimento a questo su una finestra di Windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Programmi (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); non funziona per me :(
simgineer

4
Su Windows, il percorso specificato deve usare le barre rovesciate, /, al posto delle barre rovesciate, \.
Droidman

Ha funzionato? Ho usato lo stesso codice in cui il mio file 'jks' contiene un certificato CA. Ma ottengo ancora javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: errore di trasporto: 403 Errore: errore proibito quando chiamo il codice client tramite gli stub generati SOAP. Qualche idea?
james2611nov

1
Esiste anche una proprietà del sistema di password (javax.net.ssl.trustStorePassword). Potrebbe anche essere passato come argomenti JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Consultare docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov: se ricevi un errore HTTP 403 (o qualsiasi altra risposta HTTP) durante la chiamata di un endpoint HTTPS, significa che hai superato con successo l'impostazione TLS: le interazioni HTTP avvengono solo dopo aver impostato il canale TLS ( altrimenti non potrebbero essere protetti). Quindi - sì, questa risposta apparentemente ha funzionato per te. :-)
ruakh,

295

Le proprietà SSL sono impostate a livello JVM tramite le proprietà di sistema. Ciò significa che è possibile impostarli quando si esegue il programma (java -D ....) oppure è possibile impostarli nel codice facendo System.setProperty.

I tasti specifici che devi impostare sono di seguito:

javax.net.ssl.keyStore - Posizione del file del keystore Java contenente il certificato e la chiave privata di un processo dell'applicazione. Su Windows, il percorso specificato deve utilizzare le barre rovesciate, /, al posto delle barre rovesciate.

javax.net.ssl.keyStorePassword : password per accedere alla chiave privata dal file di archivio chiavi specificato da javax.net.ssl.keyStore. Questa password viene utilizzata due volte: per sbloccare il file keystore (password di archivio) e per decrittografare la chiave privata memorizzata nel keystore (password chiave).

javax.net.ssl.trustStore - Posizione del file del keystore Java contenente la raccolta di certificati CA ritenuti attendibili da questo processo dell'applicazione (truststore). In Windows, il percorso specificato deve utilizzare slash, /al posto del backslash, \.

Se non viene specificato un percorso del truststore mediante questa proprietà, l'implementazione SunJSSE cerca e utilizza un file keystore nei seguenti percorsi (in ordine):

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

javax.net.ssl.trustStorePassword - Password per sbloccare il file di archivio chiavi (password dell'archivio ) specificato da javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Facoltativo) Per il formato file del keystore Java, questa proprietà ha il valore jks (o JKS). Normalmente non si specifica questa proprietà, poiché il suo valore predefinito è già jks.

javax.net.debug - Per attivare la registrazione per il livello SSL / TLS, impostare questa proprietà su ssl.


17
Sarebbe più appropriato collegarsi al documento da cui questo è citato. Immagino che sia così: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno

4
Il documento ufficiale dovrebbe essere la Guida di riferimento JSSE
aleung,


11
Per chiunque desideri modificare il truststore del sistema, la password predefinita è "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc

+1 per il prop javax.net.ssl.trustStorePassword. Mi guardavo intorno da un po 'e questo è stato il primo a parlarne.
jgreen

22

Solo una parola di cautela. Se si sta tentando di aprire un keystore JKS esistente in Java 9 in poi, è necessario assicurarsi di menzionare anche le seguenti proprietà con valore come "JKS":

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

Il motivo è che il tipo di archivio chiavi predefinito come prescritto nel file java.security è stato modificato in pkcs12 da jks da Java 9 in poi.


11

Prima di tutto, ci sono due tipi di keystore.

Individuale e generale

L'applicazione utilizzerà quella indicata all'avvio o l'impostazione predefinita del sistema.

Sarà una cartella diversa se JRE o JDK sono in esecuzione o se si controlla quello personale o "globale".

Anche loro sono criptati

In breve, il percorso sarà come:

$JAVA_HOME/lib/security/cacerts per il "generale", che ha tutta la CA per le autorità ed è abbastanza importante.


I tipi sono 'keystore' e 'truststore'. Si prega di non inventare una terminologia ridondante.
Marchese di Lorne,

9

puoi anche menzionare il percorso in fase di esecuzione usando le -Dproprietà come di seguito

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

Nella mia applicazione apache spark, fornivo il percorso di certs e keystore usando l' --confopzione e extraJavaoptionsin spark-submit come di seguito

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.