Вопрос:
Я пишу приложение Java 8 и хочу создать просто хранилище ключей и доверительное хранилище, используя самозаверяющий сертификат.
Обычно это происходит следующим образом:
- Создайте сертификат keypair + с помощью openssl.
- Создайте хранилище .jks keystore +.jks, используя keytool
Теперь я хотел бы использовать openssl и создавать .p12 keystores вместо .jks keystores.
Создание keystore.p12 отлично работает с помощью следующих команд:
# Create private key and certificate openssl req -x509 -newkey rsa:»${rsa}» -sha256 -keyout «${key}» -out «${cert}» -days «${days}» # Create .p12 keystore openssl pkcs12 -export -in «${cert}» -inkey «${key}» -out «${keystore}»
Это хранилище ключей, похоже, работает правильно, так как предоставление соответствующего .jks trustore в моем приложении Java приведет к подключению TLS. Однако я не могу получить .p12-сервис доверия.
Я попытался создать доверительный магазин, как предложено здесь:
# Create .p12 truststore openssl pkcs12 -export -nokeys -in «${cert}» -out «${truststore}»
а затем загрузите его следующим образом:
FileInputStream fis = new FileInputStream(new File(trustorePath)); KeyStore trustStore = KeyStore.getInstance(«PKCS12»); trustStore.load(fis, truststorePassword.toCharArray()); fis.close();
но я получаю следующее исключение в своем java-коде:
Неожиданная ошибка: java.security.InvalidAlgorithmParameterException: параметр trustAnchors должен быть непустым
Любые идеи, что я делаю неправильно?
(Приветствуется рабочий фрагмент с использованием .p12 truststore с Java 8.)
Лучший ответ:
Возможное объяснение этого поведения:
Стандартный поставщик PKCS # 12 до Java 7 не разрешил доверять записи сертификатов. Справочное руководство JSSE говорит следующее:
Сохранение доверенных сертификатов в хранилище ключей PKCS12 не поддерживается. PKCS12 в основном используется для предоставления секретных ключей с соответствующими цепи сертификатов. В нем нет понятия “доверенный”, сертификаты. Что касается совместимости, то другие поставщики PKCS12 имеют такое же ограничение. Браузеры, такие как Mozilla и Internet Explorer не принимайте файл PKCS12 только с доверенными сертификатами.
Это немного изменилось в Java 8, которое поддерживает доверенные сертификаты в PKCS # 12 – если они отмечены специальным атрибутом (OID 2.16.840.1.113894.746875.1.1):
openssl pkcs12 -in microsoft.p12 -info MAC Iteration 1024 MAC verified OK PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024 Certificate bag Bag Attributes friendlyName: microsoft it ssl sha2 (baltimore cybertrust root) 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
Источник: