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

Ссылка скопирована
1 ответ

По вводным: есть веб-сервис с REST API, требующий взаимной аутентификации TLS (1.2).
По вводным: есть JMS-сервер (Aurea) с java8, которому нужно обратиться к этому сервису.

По вводным: выданная сервисом цепочка в pkcs12 СА-провайдер-клиент(+клиентский ключ) успешно применяется в тестовом запросе в Postman, просто указанием предоставленного.pfx файла в настройках.
Сейчас ситуация такая: а из JMS не удается обратиться к сервису:

По вводным: 1) в java, в \lib\security\cacerts при импорте цепочки pkcs12 импортируется только закрытый ключ

keytool.exe -importkeystore -destkeystore .\cacerts -deststoretype JKS -deststorepass changeit -srckeystore d:\_work\test.pfx -srcstoretype PKCS12 -srcstorepass xxx Entry for alias {...} successfully imported. Import command completed: 1 entries successfully imported, 0 entries failed or cancelled

По вводным:!!! 1 entries successfully imported
По вводным: в цепочке импортируется только закрытый ключ клиента, без 3-х сертификатов

По вводным: 2. В локальном win mmc-Сертификаты импортирую цепочку.pfx и экспортирую три сертификата отдельными файлами
По вводным: через keytool импортирую их

keytool.exe -import -deststorepass changeit -trustcacerts -keystore .\cacerts -noprompt -alias ca -file "d:\_work\ca.cer" .. -alias ca_serv -file "d:\_work\serv_der.cer" ... -alias client -file "d:\_work\clnt.cer" Certificate was added to keystore

По вводным: после импорта запрос к API из JMS возвращает:

400 Bad Request No required SSL certificate was sent

По вводным: в локальном хранилище cacerts уже есть три сертификата и закрытый ключ:

keytool.exe -list -keystore ./cacerts | findstr /V jdk | findstr /V finger ca_serv, 04.12.2025, trustedCertEntry, ca, 04.12.2025, trustedCertEntry, {...}, 04.12.2025, PrivateKeyEntry, clnt, 04.12.2025, trustedCertEntry,

По вводным: смущает, что после импорта pkcs12 - keytool стал постоянно выдавать варнинг.

Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore ./cacerts -destkeystore ./cacerts -deststoretype pkcs12". Keystore type: JKS Keystore provider: SUN

Сейчас ситуация такая: попытка выполнить совет и сконвертировать в PKCS12 привела вообще к ошибке:
По вводным: the trustAnchors parameter must be non-empty

Журнал JMS:

[25/12/05 12:14:04] ID=dev_ESBTest (severe) [] Failed delivery for (MessageId: ID-VM-TEST-51337-1764925865905-0-3 on ExchangeId: ID-VM-TEST-51337-1764925865905-0-4). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.cxf.CxfOperationException: JAXRS operation failed invoking directsonicesb://Resource.testapi_v2_APIClaim.APIclaim?bindingStrategy=%23InvokeBindingStrategy.Resource.testapi_v2_APIClaim.APIclaim&headerFilterStrategy=%23InvokeHeaderFilterStrategy.Resource.testapi_v2_APIClaim.APIclaim&uriTemplate=%23URITemplate.Resource.testapi_v2_APIClaim.APIclaim with statusCode: 400org.apache.camel.component.cxf.CxfOperationException: JAXRS operation failed invoking directsonicesb://Resource.testapi_v2_APIClaim.APIclaim?bindingStrategy=%23InvokeBindingStrategy.Resource.testapi_v2_APIClaim.APIclaim&headerFilterStrategy=%23InvokeHeaderFilterStrategy.Resource.testapi_v2_APIClaim.APIclaim&uriTemplate=%23URITemplate.Resource.testapi_v2_APIClaim.APIclaim with statusCode: 400 at org.apache.camel.component.cxf.jaxrs.CxfRsProducer.populateCxfRsProducerException(CxfRsProducer.java:317) at org.apache.camel.component.cxf.jaxrs.CxfRsProducer.invokeHttpClient(CxfRsProducer.java:177) at org.apache.camel.component.cxf.jaxrs.CxfRsProducer.process(CxfRsProducer.java:87) ...

Подскажите, что может быть неверно выполнено?
Нужно понять: в каком направлении пробовать искать решение?

Updated:
По вводным: вопрос решился настройкой TLS в компоненте Apache CXF (см. Лог JMS:... at org.apache.camel.component.cxf....)
https://cxf.apache.org/docs/client-http-transport-...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для mutual TLS в Java 8 цепочку из PKCS#12 нужно правильно разделить на две задачи: client certificate с приватным ключом кладётся в keystore, а доверенные CA/серверные сертификаты — в truststore. Частая ошибка — импортировать всё в один файл и ожидать, что Java сама поймёт роли.

Если у вас есть файл client.p12, проверьте его содержимое:

keytool -list -v -storetype PKCS12 -keystore client.p12

keytool -list -v -storetype PKCS12 -keystore client.p12

Для Java 8 можно использовать PKCS12 напрямую:

java -Djavax.net.ssl.keyStore=client.p12   -Djavax.net.ssl.keyStoreType=PKCS12   -Djavax.net.ssl.keyStorePassword=changeit   -Djavax.net.ssl.trustStore=truststore.jks   -Djavax.net.ssl.trustStorePassword=changeit   -jar app.jar

java -Djavax.net.ssl.keyStore=client.p12 -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.trustStore=truststore.jks -Djavax.net.ssl.trustStorePassword=changeit -jar app.jar

Если нужно добавить цепочку CA в truststore:

keytool -importcert -alias root-ca -file root.crt -keystore truststore.jks
keytool -importcert -alias intermediate-ca -file intermediate.crt -keystore truststore.jks

keytool -importcert -alias root-ca -file root.crt -keystore truststore.jks keytool -importcert -alias intermediate-ca -file intermediate.crt -keystore truststore.jks

Если PKCS#12 не содержит полной цепочки, сервер может не принять клиентский сертификат. Тогда соберите p12 с полным chain:

openssl pkcs12 -export   -inkey client.key   -in client.crt   -certfile chain.crt   -out client-full.p12   -name client

openssl pkcs12 -export -inkey client.key -in client.crt -certfile chain.crt -out client-full.p12 -name client

Для отладки включите SSL debug:

-Djavax.net.debug=ssl,handshake

-Djavax.net.debug=ssl,handshake

По логам будет видно, отправляет ли клиент сертификат и какую цепочку видит сервер. Если ошибка bad_certificate или certificate_unknown, смотрите соответствие client cert, chain и truststore на стороне сервера.

Итог: client.p12 с приватным ключом — в keyStore, CA цепочка — в trustStore. Проверьте alias, полный chain и включите ssl debug. В Java 8 это работает нормально, если не смешивать keystore и truststore.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно