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