Как добавить цепочку 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 не удаётся подключиться.
- При импорте .pfx в cacerts через keytool импортируется только закрытый ключ, без цепочки сертификатов.
- Я попробовал импортировать отдельные сертификаты (.cer) в cacerts, но при запросе API получаю 400 Bad Request: «No required SSL certificate was sent».
- В cacerts после импорта находятся три сертификата и закрытый ключ, но keytool выдаёт предупреждение о переходе на PKCS12, а при попытке конвертации в PKCS12 появляется ошибка «the trustAnchors parameter must be non‑empty».
Как правильно импортировать цепочку PKCS12 в Java 8, чтобы JMS‑сервер мог выполнить mTLS‑аутентификацию?
Вам нужно создать один PKCS12‑keystore, в котором будет приватный ключ и полный сертификатный цепь, а затем импортировать его в Java 8, используя keytool -importkeystore.
Содержание
- Как собрать PKCS12‑keystore с цепью
- Импорт в Java 8
- Настройка JMS‑сервера
- Распространённые ошибки и их исправления
- Заключение
Как собрать PKCS12‑keystore с цепью
-
Убедитесь, что у вас есть
- приватный ключ (
client.key) - клиентский сертификат (
client.crt) - цепь промежуточных и корневых сертификатов (
ca1.crt,ca2.crtи т.п.)
- приватный ключ (
-
Создайте объединённый PEM‑файл
bashcat client.crt ca1.crt ca2.crt > chain.pem -
Экспортируйте в PKCS12
bashopenssl 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
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‑сервера
-
Клиентский keystore –
client.jks(или PKCS12). -
Truststore – должен содержать корневой/промежуточный сертификат(ы) CA, которым доверяет ваш JMS‑сервер.
bashkeytool -import -alias rootCA \ -file ca2.crt \ -keystore trust.jks \ -storepass trustPass \ -noprompt -
Параметры 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
-
Проверка
- Запустите сервер с новыми свойствами.
- С клиентского приложения (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). |
Заключение
- Создайте PKCS12‑keystore с приватным ключом и полной цепью сертификатов.
- Импортируйте его в Java 8 через
keytool -importkeystore, сохраняя alias и порядок цепи. - Настройте клиентский keystore и truststore в конфигурации JMS‑сервера.
- Проверьте соединение – после правильного импорта mTLS‑аутентификация должна проходить без ошибок.
Таким образом, ваш JMS‑сервер сможет использовать клиентский сертификат из PKCS12, а Postman продолжит работать, так как он также понимает формат PKCS12.