web-dev-qa-db-fra.com

java SSL et le fichier de clés de certification

Comment mon programme Java sait-il où se trouve mon magasin de clés contenant le certificat? Ou encore, comment indiquer à mon programme Java où rechercher le fichier de clés?

Après avoir spécifié le magasin de clés, comment spécifier le certificat à utiliser pour authentifier le serveur sur le client?

148
deborah
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
100
DaveH

Les propriétés SSL sont définies au niveau de la machine virtuelle via les propriétés système. Cela signifie que vous pouvez les définir lorsque vous exécutez le programme (Java -D ....) ou vous pouvez les définir dans le code en utilisant System.setProperty.

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

javax.net.ssl.keyStore - Emplacement du fichier de clés 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 de clés spécifié par javax.net.ssl.keyStore. Ce mot de passe est utilisé deux fois: pour déverrouiller le fichier de clés (mot de passe du magasin) et pour déchiffrer la clé privée stockée dans le magasin de clés (mot de passe de clé).

javax.net.ssl.trustStore - Emplacement du fichier de clés Java contenant la collection de certificats d'autorité de certification approuvés par ce processus d'application (magasin de confiance). Sous Windows, le chemin spécifié doit utiliser des barres obliques, /, à la place des barres obliques inverses, \.

Si aucun emplacement de magasin de clés de confiance n'est spécifié à l'aide de cette propriété, l'implémentation SunJSSE recherche et utilise un fichier de magasin de clés dans les 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.trustStoreTypeFacultatif) Pour le format de fichier de magasin de clés Java, cette propriété a la valeur jks (ou JKS). Normalement, vous ne spécifiez 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.

281

Juste un mot de prudence. Si vous essayez d'ouvrir un fichier de clés 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 en est que le type de magasin de clés par défaut, tel que prescrit dans le fichier Java.security, a été remplacé par pkcs12 à partir de jks à partir de Java 9.

13
Sankar Natarajan

Tout d’abord, il existe deux types de magasins de clés.

Individuel et Général

L'application utilisera celle indiquée au démarrage ou la valeur 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 aussi 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 qui est assez important.

11
Carlos Garcia

vous pouvez également mentionner le chemin au moment de l'exécution en utilisant -D proprié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, je fournissais le chemin des certs et du magasin de clés à l'aide de l'option --conf et de extraJavaoptions dans 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' 
7