Если вы хотите изменить, какой сертификат используется в зависимости от которого производится подключение, вам необходимо настроить SSLContext
сделать так, как описано в этом ответе: https://stackoverflow.com/a/3713147/372643
Насколько я знаю, ось 2 использует Apache HttpClient 3.x, поэтому вам нужно будет выполнить его способ настройки SSLContext
(и X509KeyManager
при необходимости). Самый простой способ - настроить глобальный обработчик протокола Apache HttpClient https
с вашим SSLContext
, настроенным с помощью X509KeyManager
, настроенного для выбора сертификата клиента по вашему желанию (через chooseClientAlias
).
Если эмитентов и подключенных Socket
(возможно, удаленных адресов) недостаточно для определения того, какой сертификат выбрать, вам может потребоваться реализовать более сложную логику, которая почти неизбежно потребует тщательной синхронизации с остальной частью вашего приложения.
EDIT:
После того, как вы создали ваш SSLContext
и X509KeyManager
, вы должны передать их в Apache HttpClient 3.x. Для этого вы можете создать свой собственный SecureProtocolSocketFactory, который будет строить сокет из этого SSLContext
(через SSLSocketFactory
, см. SSLContext
методов). Есть примеры в Apache HttpClient 3.x SSL guide. Избегайте EasySSLProtocolSocketFactory
, так как он не будет проверять сертификат сервера (тем самым допуская атаки MITM). Вы также можете попробовать this implementation.
Обратите внимание, что вы только действительно нужно настроить свой X509KeyManager
, вы можете инициализировать SSLContext
(через init
) с null
для других параметров, чтобы сохранить значения по умолчанию (в частности, настройки по умолчанию доверия).
Затем, «установить» этот SecureProtocolSocketFactory
глобально для Apache HttpClient 3.x, используя что-то вроде этого:
Protocol.registerProtocol("https", new Protocol("https",
(ProtocolSocketFactory)secureProtocolSocketFactory, 443));
¿Это принимает во внимание, что вам нужно текущий сертификат, чтобы получить сообщение с новым сертификатом? Кроме того, клиент WS должен иметь возможность заменить сертификат в хранилище ключей, поскольку он не может проживать за пределами хранилища ключей и оставаться доступным для java. – Alfabravo