Защищенное паролем хранилище доверия, созданное с помощью keytool, не отображает записи, если пароль не предоставлен - PullRequest
2 голосов
/ 02 апреля 2019

Я борюсь с разницей в поведении между способом, которым keytool создает хранилище ключей (используемое здесь как хранилище доверенных сертификатов) и импортирует доверенный сертификат, в отличие от других инструментов (например, portecle , kse ) сделать то же самое.

Рассмотрите эту команду:

keytool -import -alias myAlias -file ./my_exported_server_cert.crt \
-keystore ./my_truststore.jks

Это запросит у меня пароль, а затем создайте my_truststore.jks, содержащий сертификат.

Теперь, если я загляну внутрь и укажу правильный пароль, в списке будет myAlias:

keytool -v -list -keystore ./my_truststore.jks -storeType jks -storepass myPass

или программно ...

try (InputStream is = new FileInputStream(new File("./my_truststore.jks"))) {
    KeyStore keyStore = KeyStore.getInstance("jks");
    keyStore.load(is, "myPassword".toCharArray());
    Iterator<String> it = keyStore.aliases().asIterator();
    while (it.hasNext()) System.out.println(it.next());
}

Однако, если я не предоставляю пароль (т. Е. Удаляем параметр storepass из вызова keytool и при появлении запроса вводим, или вызываем load с null в качестве второгоаргумент в коде Java), записи не указаны.

keytool выдает предупреждение, но не содержит записей.

Теперь, если я сгенерирую хранилище доверенных сертификатов и импортирую сертификат таким же образом с помощью portecle или kse, установлю пароль и снова выполню проверки без ввода пароля, myAlias по-прежнему будет отображаться как запись (keytool отображает предупреждение, как и ожидалось, но также отображает сертификат).

1034 * Мое спорно пониманием этого вопроса является то, что пароль менее релевантный прочитать содержание целевого магазина (без особого расследования я также предполагающий, поэтому TrustManagerFactory # INIT не принимает пароль, в отличие от KeyManagerFactory # init ).

Мой вопрос

  • В чем причинаразница в поведении?Разве эти инструменты не используют те же основные API-интерфейсы, что и keytool за кулисами?
  • Есть ли способ параметризации keytool, чтобы создать хранилище доверия, которое позволяет просматривать записи для записей при запросе с помощьюнет пароля, как и другие инструменты?

Примечания

Я повторил это поведение с keytool из:

  • Oracle JDK 11
  • Oracle JDK 12
  • OpenJDK11

При тестировании с keytool из Oracle JDK8 я замечаю, что запись найдена, хотя я получаю предупрежденияпри первоначальном создании хранилища ключей на стороне сервера, а также при экспорте одного сертификата:

Хранилище ключей JKS использует собственный формат.Рекомендуется перейти на PKCS12, который является отраслевым стандартным форматом, с использованием "keytool -importkeystore -srckeystore ./ora8_keystore.jks -destkeystore ./ora8_keystore.jks -deststoretype pkcs12"

Кроме того, рукопожатие SSLиспользование хранилища доверенных сертификатов, созданного с помощью keytool из Oracle JDK8, кажется, навсегда зависает без следов сбоев.

Во время отладки своего Java-кода я заметил, что хранилища доверенных сертификатов, сгенерированные любым из этих инструментов и JDK (включая Oracle JDK8), были в конечном итоге инициализированы через фабрику как хранилище ключей двойного формата независимо от используемого аргумента фабрики (jks), то есть объект хранилища ключей был класса sun.security.provider.JavaKeyStore$DualFormatJKS, с spi, имеющим primaryType = JKS и secondaryType = PCKS12.

Этот последний бит на самом деле не помогает мне понять, но это может быть как-то уместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...