Вопрос-ответ

SSL and cert keystore

Хранилище ключей SSL и сертификатов

Как моя Java-программа узнает, где находится мое хранилище ключей, содержащее сертификат?

Или в качестве альтернативы: как мне сообщить моей Java-программе, где искать хранилище ключей?

После указания хранилища ключей каким-либо образом, как указать сертификат, который будет использоваться для аутентификации сервера перед клиентом?

Переведено автоматически
Ответ 1

Свойства SSL устанавливаются на уровне JVM через системные свойства. Это означает, что вы можете либо установить их при запуске программы (java -D ....), либо вы можете установить их в коде, выполнив System.setProperty .

Конкретные ключи, которые вы должны установить, приведены ниже:


javax.net.ssl.keyStore- расположение файла хранилища ключей Java, содержащего собственный сертификат и закрытый ключ прикладного процесса. В Windows указанный путь должен содержать косую черту / вместо обратной.


javax.net.ssl.keyStorePassword - пароль для доступа к закрытому ключу из файла хранилища ключей, указанного javax.net.ssl.keyStore. Этот пароль используется дважды: для разблокировки файла хранилища ключей (пароль хранилища) и для расшифровки закрытого ключа, хранящегося в хранилище ключей (пароль ключа).


javax.net.ssl.trustStore - Расположение файла хранилища ключей Java, содержащего коллекцию сертификатов CA, которым доверяет этот прикладной процесс (trust store). В Windows указанный путь должен содержать косую черту, / вместо обратной косой черты, \.


Если местоположение хранилища доверия не указано с помощью этого свойства, реализация SunJSSE выполняет поиск и использует файл хранилища ключей в следующих расположениях (по порядку):



  1. $JAVA_HOME/lib/security/jssecacerts

  2. $JAVA_HOME/lib/security/cacerts


javax.net.ssl.trustStorePassword - пароль для разблокировки файла хранилища ключей (пароль хранилища), указанный javax.net.ssl.trustStore.


javax.net.ssl.trustStoreType - (Необязательно) Для формата файла хранилища ключей Java это свойство имеет значение jks (или JKS). Обычно это свойство не указывается, поскольку его значением по умолчанию уже является jks.


javax.net.debug - Чтобы включить ведение журнала для уровня SSL / TLS, установите для этого свойства значение ssl.


Ответ 2
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
Ответ 3

Просто предостережение. Если вы пытаетесь открыть существующее хранилище ключей JKS в Java 9 и более поздних версиях, вам нужно убедиться, что вы также указываете следующие свойства со значением "JKS".:

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

Причина в том, что тип хранилища ключей по умолчанию, как предписано в файле java.security, был изменен на pkcs12 из jks начиная с Java 9.

Ответ 4

вы также можете указать путь во время выполнения, используя -D свойства, как показано ниже

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

В моем приложении apache spark я указывал путь к сертификатам и хранилищу ключей, используя --conf option и extraJavaoptions в spark-submit, как показано ниже

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

2023-09-26 08:31 java