Какой самый удобный способ открыть хранилище доверенных сертификатов Java по умолчанию? - PullRequest
1 голос
/ 12 июня 2019

Я программно управляю Java TrustStore по умолчанию. Для этого мне нужен его путь.

Я попытался прочитать javax.net.ssl.keyStore и javax.net.ssl.trustStore, и они оба не определены.

Я придумал System.getenv("JAVA_HOME") + "/jre/lib/security/cacerts", это правильный подход?

Это работает, но я бы хотел, чтобы код был максимально переносимым и ориентированным на будущее.

редактирует:

  1. Это приложение, работающее в AWS Lambda, Lamda не позволяет настраивать или предоставлять собственную JRE.
  2. Этот вопрос изначально задавался для хранилища ключей по умолчанию. Я изменил его на хранилище доверенных сертификатов, поскольку хранилища ключей зависят от приложения.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

Нет. Вероятно, у вас нет прав на изменение файлов в установленной JRE. И этот путь не существует, начиная с Java 9.

Кроме того, в Java 11 нет JRE. Единственный способ распространения приложения - использовать jlink для создания образа, содержащего подмножество Java SE, содержащее только модули, требуемые приложением.

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

В любом случае вы не должны изменять пользовательскую установку Java. Ваш код должен включать пользовательский файл хранилища ключей в качестве приложения resource , который вы должны передать Keystore.load :

InputStream embeddedKeystore =
    MyApplication.class.getResourceAsStream("custom-keystore.pkcs");

assert embeddedKeystore != null : "Application was not properly built."
    + " Keystore is missing!";

KeyStore keystore = KeyStore.getInstance("pkcs12");
keystore.load(embeddedKeystore,
    new char[] { 's', 'w', 'o', 'r', 'd', 'f', 'i', 's', 'h' });

embeddedKeystore.close();
0 голосов
/ 02 июля 2019

Вы можете использовать свой собственный путь для trustsotre и хранилища ключей, передавая системную опцию свойства JVM

-Djavax.net.ssl.keyStore=your_custom_path
-Djavax.net.ssl.trustStore=your_custom_path
0 голосов
/ 13 июня 2019

Размещение моего решения до сих пор.

В моем вопросе я читал из System.getenv("JAVA_HOME") + "/jre/lib/security/cacerts", но это путь к JDK (который не установлен в AWS Lambda) и является корнем папки / jre.

String trustStoreLocation = Optional.ofNullable(System.getProperty("javax.net.ssl.trustStore"))
    .orElseGet(() -> System.getProperty("java.home") + "/lib/security/cacerts");

File trustStoreFile = new File(trustStoreLocation);
if (!trustStoreFile.exists()) {
    throw new RuntimeException("Unable to locate the Java TrustStore: the system property javax.net.ssl.trustStore is undefined or " + trustStoreLocation + " does not exist.");
}

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
try (FileInputStream fis = new FileInputStream(trustStoreFile)) {
    keyStore.load(fis, new char[] { 't','h','e',' ','p','a','s','s','w','o','r','d' });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...