java SSL et cert keystore

165

Comment mon programme Java sait-il où se trouve mon keystore contenant le certificat? Ou comment dire à mon programme Java où chercher le keystore?

Après avoir spécifié le keystore d'une manière ou d'une autre, comment spécifier le certificat à utiliser pour authentifier le serveur auprès du client?

Deborah
la source
mieux vaut éviter d'utiliser le paramètre System.setProperty (les approches ci-dessous), voir: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , comment construire le KeyManagerFactory pour SSLContext
Marek- A-

Réponses:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
la source
4
quelqu'un sait comment référencer cela sur une boîte de fenêtres? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Program Files (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); ne fonctionne pas pour moi :(
simgineer
4
Sous Windows, le chemin spécifié doit utiliser des barres obliques, /, à la place des barres obliques inverses, \.
Droidman
Cela a-t-il fonctionné? J'ai utilisé le même code où mon fichier «jks» contient un certificat CA. Mais j'obtiens toujours javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Erreur de transport: 403 Erreur: Erreur interdite lorsque j'appelle le code client via les stubs générés par SOAP. Des idées?
james2611nov
1
Il existe également une propriété système de mot de passe (javax.net.ssl.trustStorePassword). Peut également être passé en tant qu'arguments JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Reportez-vous à docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly
@ james2611nov: Si vous obtenez une erreur HTTP 403 (ou toute autre réponse HTTP) appelant un point de terminaison HTTPS, cela signifie que vous avez réussi à passer la configuration TLS: les interactions HTTP n'ont lieu qu'une fois le canal TLS configuré ( sinon, ils ne pourraient pas être protégés). Alors - oui, cette réponse a apparemment fonctionné pour vous. :-)
ruakh
295

Les propriétés SSL sont définies au niveau JVM via les propriétés système. Cela signifie que vous pouvez soit les définir lorsque vous exécutez le programme (java -D ....), soit les définir dans le code en faisant System.setProperty.

Les clés spécifiques que vous devez définir sont ci-dessous:

javax.net.ssl.keyStore - Emplacement du fichier de keystore Java contenant le certificat et la clé privée d'un processus d'application. Sous Windows, le chemin spécifié doit utiliser des barres obliques, /, à la place des barres obliques inverses.

javax.net.ssl.keyStorePassword - Mot de passe pour accéder à la clé privée à partir du fichier keystore spécifié par javax.net.ssl.keyStore. Ce mot de passe est utilisé deux fois: pour déverrouiller le fichier keystore (mot de passe de stockage) et pour déchiffrer la clé privée stockée dans le keystore (mot de passe clé).

javax.net.ssl.trustStore - Emplacement du fichier de keystore Java contenant la collection de certificats CA approuvés par ce processus d'application (trust store). Sous Windows, le chemin spécifié doit utiliser des barres obliques vers l' avant, /à la place de antislashs, \.

Si un emplacement de magasin de clés de confiance n'est pas spécifié à l'aide de cette propriété, l'implémentation SunJSSE recherche et utilise un fichier de clés aux emplacements suivants (dans l'ordre):

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

javax.net.ssl.trustStorePassword - Mot de passe pour déverrouiller le fichier de clés (mot de passe du magasin) spécifié par javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Facultatif) Pour le format de fichier de keystore Java, cette propriété a la valeur jks (ou JKS). Vous ne spécifiez normalement pas cette propriété, car sa valeur par défaut est déjà jks.

javax.net.debug - Pour activer la journalisation pour la couche SSL / TLS, définissez cette propriété sur ssl.

Karthik Ramachandran
la source
17
Il serait plus approprié de créer un lien vers le document à partir duquel il est cité. Je suppose que c'est ça: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno
4
Le document officiel doit être le Guide de référence JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung le
4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… est plus approprié maintenant.
Rick-777 du
11
Pour toute personne souhaitant modifier le magasin de confiance système, le mot de passe par défaut est "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 pour la prop javax.net.ssl.trustStorePassword. J'avais cherché pendant un moment et c'était le premier à en parler.
jgreen
22

Juste un mot d'avertissement. Si vous essayez d'ouvrir un keystore JKS existant à partir de Java 9, vous devez vous assurer de mentionner également les propriétés suivantes avec la valeur "JKS":

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

La raison étant que le type de keystore par défaut tel que prescrit dans le fichier java.security a été changé en pkcs12 à partir de jks à partir de Java 9.

Sankar Natarajan
la source
11

Tout d'abord, il existe deux types de keystores.

Individuel et général

L'application utilisera celui indiqué au démarrage ou celui par défaut du système.

Ce sera un dossier différent si JRE ou JDK est en cours d'exécution, ou si vous cochez le dossier personnel ou "global".

Ils sont également cryptés

En bref, le chemin sera comme:

$JAVA_HOME/lib/security/cacerts pour le "général", qui a tout le CA pour les autorités et est assez important.

Carlos Garcia
la source
Les types sont «keystore» et «truststore». Veuillez ne pas inventer une terminologie redondante.
Marquis of Lorne le
9

vous pouvez également mentionner le chemin au moment de l'exécution en utilisant les -Dpropriétés comme ci-dessous

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

Dans mon application apache spark, j'avais l'habitude de fournir le chemin des certificats et du keystore en utilisant l' --confoption et extraJavaoptionsdans spark-submit comme ci-dessous

--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
la source