Я борюсь с разницей в поведении между способом, которым 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
.
Этот последний бит на самом деле не помогает мне понять, но это может быть как-то уместно.