У меня есть разные службы, использующие 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 записи, он не выбирает правильный.
Может ли кто-нибудь помочь мне с этим? Возможно, файлы нельзя смешивать или есть другой способ сделать это.
Спасибо,
Потому что идея состоит в том, чтобы не использовать больше кода Java и перестать загружать файлы при каждом запросе. Могу ли я указать SSLContexts без загрузки хранилища ключей в java?
Нет необходимости каждый раз загружать файлы. Вы инициализируете SSLContext только один раз с заданным хранилищем доверенных сертификатов/хранилищем ключей, а затем повторно используете SocketFactory, предоставленный этим SSLContext.
Похоже, вы делаете это, чтобы включить взаимную аутентификацию сертификатов, а не настраивать простой коннектор HTTPS.
Я бы предложил объединить сертификаты в один .pfx
, экспортировав их как текстовые .pem
файлы и соединив их. Это также можно использовать для ручного создания цепочек сертификатов.
openssl pkcs12 -in example.pfx -out example.pem -nodes
BEGIN CERTIFICATE
и END CERTIFICATE
openssl pkcs12 -export -in example.pem -out example-concat.pfx
Почему бы не использовать разные SSLContexts для разных сервисов? Каждый со своим хранилищем ключей.