Прикрепить клиентские сертификаты с помощью Axis2? - PullRequest
8 голосов
/ 27 декабря 2011

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

Я нашел примеры, где это делается для вызовов не-SOAP, но не смог найти ничего, связанного с использованием клиентских заглушек Axis.Попытка взломать XML для вызова SOAP - вариант, полагающий, болезненный вариант!Стонать!

1 Ответ

6 голосов
/ 27 декабря 2011

Если вы хотите изменить используемый сертификат в зависимости от того, какое соединение установлено, вам нужно настроить SSLContext для этого, как описано в этом ответе: https://stackoverflow.com/a/3713147/372643

Насколько я знаю, Axis 2 использует Apache HttpClient 3.x, поэтому вам нужно будет выполнить настройку SSLContextX509KeyManager, если необходимо). Самым простым способом может быть настройка глобального обработчика протокола 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));
...