Хранилище ключей SSL и сертификатов Java
Как моя Java-программа узнает, где находится мое хранилище ключей, содержащее сертификат? Или, в качестве альтернативы, как мне указать моей Java-программе, где искать хранилище ключей?
После указания хранилища ключей, каким образом указать сертификат, который будет использоваться для аутентификации сервера на клиенте?
6 ответов
System.setProperty("javax.net.ssl.trustStore",path_to_your_cacerts_file);
Свойства 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 ищет и использует файл хранилища ключей в следующих местах (по порядку):
$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.
Просто предупреждение. Если вы пытаетесь открыть существующее хранилище ключей JKS в Java 9 и более поздних версиях, необходимо убедиться, что вы также упоминаете следующие свойства со значением как "JKS":
javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType
Причина в том, что тип хранилища ключей по умолчанию, как предписано в файле java.security, был изменен на pkcs12 с jks с Java 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
в спарк-подчинении как ниже
--conf 'spark.driver.extraJavaOptions=
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks'
Прежде всего, есть два вида хранилищ ключей.
Индивидуальный и общий
Приложение будет использовать тот, который указан при запуске или по умолчанию системы.
Это будет другая папка, если работает JRE или JDK, или если вы проверите личную или "глобальную" папку.
Они тоже зашифрованы
Короче говоря, путь будет такой:
$JAVA_HOME/lib/security/cacerts
для "общего", который имеет все CA для властей и является весьма важным.
В системе M1 iMac для импорта ключа для использования с Java или IDE, такой как jGRASP, используйте команду sudo keytool -importcert -keystore после пути к примеру хранилища ключей Java здесь и пути к сертификату, который вы хотите импортировать в моем примере. У меня есть SSL-сертификат pfsense для использовать с прокси и брандмауэром.
sudo keytool -importcert -keystore/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home/lib/security/cacerts-storepasschangeit -file ~/Downloads/SquidCA.crt -alias "root_cert" /Library/Java/ JavaVirtualMachines/jdk-19.jdk/Contents/Home/lib/security/cacerts
На iMAC M1, чтобы просмотреть содержимое хранилища сертификатов для Java:
keytool -list -keystore "/Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home/lib/security/cacerts" Предупреждение: используйте опцию -cacerts для доступа к хранилищу ключей cacerts.
пароль по умолчанию — Changeit
После переустановки jGRASP или той IDE, которую вы используете, и она работает с кодом Java, например:
URL news = новый URL("https://moxie.foxnews.com/feedburner/world.xml/");
BufferedReader in = новый BufferedReader(новый InputStreamReader(news.openStream()));Изображение: Java-программа, работающая с доверенным корневым сертификатом SSL, установленным с использованием URL-адреса https. URL-адрес отображается как в прокси-сервере Pfsense Firewall, так и в jGRASP IDE.
Опять же, да, инструменты Java JDK могут работать с самозаверяющими сертификатами SSL.
Он также работает в Windows 11, просто используйте путь к комплекту Oracle JDK.
C:\Program Files\Java\jdk-20\lib\security\cacerts
траектория инструмента
C:\Program Files\Java\jdk-20\bin\keytool
Я просто помещаю нужный мне сертификат в папку с именем Security и запускаю те же команды, что и imac, только по другим путям.
Пример:пример использования Windows 10
Добавлен корневой сертификат Java
Что мне нравится в этом, так это то, что когда я тестирую код Java с операторами импорта, брандмауэр может видеть любые отключения или любые запросы на получение http https, которые не должны происходить в большом исходном коде. Если что-то скрыто в элементе импорта, теперь брандмауэр может это увидеть.