Программирование

Как добавить цепочку PKCS12 в Java 8 для mTLS

Создайте PKCS12‑keystore с приватным ключом и цепочкой, импортируйте в Java 8 через keytool, настройте JMS‑сервер и truststore для успешной mTLS‑аутентификации.

Как добавить цепочку сертификатов PKCS12 в Java 8 для взаимной аутентификации TLS?

У меня есть веб‑сервис с REST API, требующий mTLS 1.2. Я использую JMS‑сервер (Aurea) на Java 8. В Postman при указании .pfx файла запрос проходит, но из JMS не удаётся подключиться.

  1. При импорте .pfx в cacerts через keytool импортируется только закрытый ключ, без цепочки сертификатов.
  2. Я попробовал импортировать отдельные сертификаты (.cer) в cacerts, но при запросе API получаю 400 Bad Request: «No required SSL certificate was sent».
  3. В cacerts после импорта находятся три сертификата и закрытый ключ, но keytool выдаёт предупреждение о переходе на PKCS12, а при попытке конвертации в PKCS12 появляется ошибка «the trustAnchors parameter must be non‑empty».

Как правильно импортировать цепочку PKCS12 в Java 8, чтобы JMS‑сервер мог выполнить mTLS‑аутентификацию?

Вам нужно создать один PKCS12‑keystore, в котором будет приватный ключ и полный сертификатный цепь, а затем импортировать его в Java 8, используя keytool -importkeystore.


Содержание


Как собрать PKCS12‑keystore с цепью

  1. Убедитесь, что у вас есть

    • приватный ключ (client.key)
    • клиентский сертификат (client.crt)
    • цепь промежуточных и корневых сертификатов (ca1.crt, ca2.crt и т.п.)
  2. Создайте объединённый PEM‑файл

    bash
    cat client.crt ca1.crt ca2.crt > chain.pem
    
  3. Экспортируйте в PKCS12

    bash
    openssl pkcs12 -export \
        -inkey client.key \
        -in chain.pem \
        -out client.p12 \
        -name client \
        -passout pass:myP12Pass
    

    -name задаёт псевдоним (alias), который будет использоваться в Java.

Важно: порядок сертификатов в chain.pem должен быть от клиентского к корневому (client → intermediate → root).


Импорт в Java 8

bash
keytool -importkeystore \
    -srckeystore client.p12 \
    -srcstoretype PKCS12 \
    -srcstorepass myP12Pass \
    -destkeystore client.jks \
    -deststoretype JKS \
    -deststorepass myJksPass \
    -destalias client
  • client.jks будет содержать PrivateKeyEntry с полной цепью.
  • Если вы хотите оставить формат PKCS12, замените -deststoretype JKS на -deststoretype PKCS12.
  • При этом в JRE 8 ключ и цепь остаются валидными, а предупреждение о переходе на PKCS12 можно игнорировать.

Ссылка: Oracle – keytool – Importing a PKCS#12 file into a Java keystore


Настройка JMS‑сервера

  1. Клиентский keystoreclient.jks (или PKCS12).

  2. Truststore – должен содержать корневой/промежуточный сертификат(ы) CA, которым доверяет ваш JMS‑сервер.

    bash
    keytool -import -alias rootCA \
        -file ca2.crt \
        -keystore trust.jks \
        -storepass trustPass \
        -noprompt
    
  3. Параметры JVM (или конфигурационные свойства JMS‑сервера):

    bash
    -Djavax.net.ssl.keyStore=/path/to/client.jks
    -Djavax.net.ssl.keyStorePassword=myJksPass
    -Djavax.net.ssl.trustStore=/path/to/trust.jks
    -Djavax.net.ssl.trustStorePassword=trustPass
    
  4. Проверка

    • Запустите сервер с новыми свойствами.
    • С клиентского приложения (Postman) используйте тот же .pfx – запрос должен пройти.
    • В логах сервера убедитесь, что SSLHandshake завершён без ошибок.

Распространённые ошибки и их исправления

Ошибка Что происходит Как исправить
«No required SSL certificate was sent» Сертификат не отправляется, потому что keystore содержит только цепь без приватного ключа. Убедитесь, что в keystore есть PrivateKeyEntry (псевдоним, например client).
trustAnchors parameter must be non‑empty При попытке конвертировать cacerts в PKCS12 не загружены корневые сертификаты. Создайте отдельный truststore с нужными корневыми сертификатами и используйте его.
Псевдоним совпадает со стандартным При импорте в cacerts alias client может конфликтовать. Используйте уникальный alias и явно задайте его в -destalias.
Отклонённые сертификаты Сертификат не совпадает с CA, которой доверяет сервер. Добавьте CA в truststore.
Предупреждение о переходе на PKCS12 Java 8 предупреждает о будущей смене формата. Можно игнорировать, но лучше держать keystore в PKCS12 (-deststoretype PKCS12).

Заключение

  1. Создайте PKCS12‑keystore с приватным ключом и полной цепью сертификатов.
  2. Импортируйте его в Java 8 через keytool -importkeystore, сохраняя alias и порядок цепи.
  3. Настройте клиентский keystore и truststore в конфигурации JMS‑сервера.
  4. Проверьте соединение – после правильного импорта mTLS‑аутентификация должна проходить без ошибок.

Таким образом, ваш JMS‑сервер сможет использовать клиентский сертификат из PKCS12, а Postman продолжит работать, так как он также понимает формат PKCS12.

Авторы
Проверено модерацией
Модерация