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

165

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

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

Дебора
источник
лучше избегать использования параметра System.setProperty (подходы ниже), см. docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/… , как создать KeyManagerFactory для SSLContext
Marek- А-

Ответы:

111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);
DaveH
источник
4
Кто-нибудь знает, как ссылаться на это на коробке Windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Program Files (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); у меня не работает :(
simgineer
4
В Windows указанный путь должен использовать прямую косую черту, / вместо обратной косой черты \.
Droidman
Это сработало? Я использовал тот же код, где мой файл 'jks' содержит сертификат CA. Но я все еще получаю javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Транспортная ошибка: 403 Ошибка: запрещенная ошибка, когда я вызываю код клиента через сгенерированные заглушки SOAP. Любые идеи?
james2611nov
1
Существует также системное свойство пароля (javax.net.ssl.trustStorePassword). Может также быть переданы в качестве аргументов JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword см docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Кингсли
@ james2611nov: Если вы получаете ошибку HTTP 403 (или любой другой ответ HTTP), вызывающий конечную точку HTTPS, то это означает, что вы успешно прошли настройку TLS: взаимодействия HTTP происходят только после настройки канала TLS ( иначе они не могли быть защищены). Так что - да, этот ответ, видимо, сработал для вас. :-)
руах
295

Свойства 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, которым доверяет этот процесс приложения (хранилище доверенных сертификатов). В 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.

Картик Рамачандран
источник
17
Было бы более уместно сослаться на документ, из которого это цитируется. Полагаю, это так: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Бруно,
4
Официальный документ должен быть Справочное руководство JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung
4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/… более уместен сейчас.
Рик-777
11
Для всех, кто захочет отредактировать системное доверенное хранилище, пароль по умолчанию - «changeit»: community.oracle.com/thread/1540678?start=0&tstart=0
cwc
+1 за реквизит javax.net.ssl.trustStorePassword. Я некоторое время оглядывался по сторонам, и это было первым, кто упомянул об этом.
jgreen
22

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

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

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

Санкар Натараджан
источник
11

Во-первых, есть два вида хранилищ ключей.

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

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

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

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

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

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

Карлос Гарсия
источник
Типы это «хранилище ключей» и «хранилище доверенных сертификатов». Пожалуйста, не изобретайте избыточную терминологию.
маркиз Лорн
9

Вы также можете упомянуть путь во время выполнения, используя -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, как показано ниже

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Балакумаран Муралидхаран
источник