Добавить разные сертификаты p12 в jvm

У меня есть разные службы, использующие SSL в моем приложении, эти службы используют разные файлы .p12 для подключения с разными паролями. Прямо сейчас java загружает хранилище доверенных сертификатов и хранилище ключей + файлы при каждом вызове, поэтому я хочу удалить это поведение и добавить сертификаты в свою JVM по умолчанию, это то, что я могу сделать, используя

-Djavax.net.ssl.keyStore="{mycert.p12}" -Djavax.net.ssl.keyStorePassword={mypassword} -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.trustStore="{cacertsroute}" -Djavax.net.ssl.trustStorePassword=changeit

Но у меня разные файлы p12, поэтому мне нужно объединить их в один файл, потому что я не могу указать jvm для использования нескольких файлов p12 и паролей в командной строке.

Я создал новый файл p12 пустым и добавил один из файлов p12 внутрь с помощью keytool.

keytool -importkeystore -srckeystore first.p12 -srcstoretype pkcs12 -srcstorepass firstp12pass -destkeystore newstore.p12 -deststoretype pkcs12 -deststorepass firstp12pass

После этого у меня есть новое хранилище ключей только с одним p12, и оно работает со службой, использующей сертификат first.p12. Я читал, что хранилище ключей и p12 должны иметь одинаковый пароль, поэтому для добавления второго файла p12 я создал файл temp.p12, который меняет пароль second.p12 на firstp12pass, поэтому теперь у них один и тот же пароль, а затем я используйте ту же команду, что и раньше, чтобы добавить temp.p12 (второй.p12) в newstore.p12.

Теперь у меня есть только 1 файл с двумя записями для разных служб, но когда я использую сертификат, теперь он не работает.

Я отладил вызов ssl, и кажется, что CN не в порядке. Когда я звоню с p12 только с одной записью, он отправляет правильный CN на сервер, но когда я использую 2 записи, он не выбирает правильный.

Может ли кто-нибудь помочь мне с этим? Возможно, файлы нельзя смешивать или есть другой способ сделать это.

Спасибо,

Почему бы не использовать разные SSLContexts для разных сервисов? Каждый со своим хранилищем ключей.

apangin 22.05.2019 15:13

Потому что идея состоит в том, чтобы не использовать больше кода Java и перестать загружать файлы при каждом запросе. Могу ли я указать SSLContexts без загрузки хранилища ключей в java?

Nicolás Escobar 22.05.2019 16:14

Нет необходимости каждый раз загружать файлы. Вы инициализируете SSLContext только один раз с заданным хранилищем доверенных сертификатов/хранилищем ключей, а затем повторно используете SocketFactory, предоставленный этим SSLContext.

apangin 22.05.2019 16:36
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
3
735
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы делаете это, чтобы включить взаимную аутентификацию сертификатов, а не настраивать простой коннектор HTTPS.

Я бы предложил объединить сертификаты в один .pfx, экспортировав их как текстовые .pem файлы и соединив их. Это также можно использовать для ручного создания цепочек сертификатов.

  1. Преобразование PFX в PEM (преобразование обоих файлов PFX): openssl pkcs12 -in example.pfx -out example.pem -nodes
  2. Объедините оба файла PEM, включая теги BEGIN CERTIFICATE и END CERTIFICATE
  3. Преобразуйте объединенный файл PEM обратно в PFX: openssl pkcs12 -export -in example.pem -out example-concat.pfx

Другие вопросы по теме