Java SSL и cert keystore

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

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

Ответ 1

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

Ответ 2

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

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

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

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

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

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

  • $JAVA_HOME/lib/security/jssecacerts
  • $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.

Ответ 3

Прежде всего, есть два вида хранилищ ключей.

Индивидуальный и общий

Приложение будет использовать тот, который указан при запуске или по умолчанию системы.

Это будет другая папка, если работает JRE или JDK, или если вы проверите личную или "глобальную" папку.

Они тоже зашифрованы

Короче, путь будет такой:

$JAVA_HOME/lib/security/cacerts для "общего", у которого есть все CA для Властей, и это очень важно.

Ответ 4

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

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

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

Ответ 5

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

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

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

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