2011-12-26 2 views
7

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

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

+0

¿Это принимает во внимание, что вам нужно текущий сертификат, чтобы получить сообщение с новым сертификатом? Кроме того, клиент WS должен иметь возможность заменить сертификат в хранилище ключей, поскольку он не может проживать за пределами хранилища ключей и оставаться доступным для java. – Alfabravo

ответ

6

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

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

Спасибо, полезная информация. Поэтому мне нужно сделать это: httpclient.getHostConfiguration(). SetHost («www.whatever.com», 443, myhttps); «Как получить HTTPClient в Axis2? У меня есть org.apache. axis2.client.Stub и ServiceClient, но как я могу получить базовый httpClient из этих экземпляров? – Sunny

+0

Я пробовал подход, похожий на другой пост http://stackoverflow.com/a/6469030/420611 Но я продолжаю получать это исключение, независимо от того, использую ли я 'EasySSLProtocolSocketFactory' или' StrictSSLProtocolSocketFactory': org.apache.commons. ssl.ProbablyBadPasswordException: Вероятно, плохой пароль JKS-Key: java.security.UnrecoverableKeyException: Пароль не должен быть нулевым. – Sunny

+0

@ Заключенный, это похоже на проблему с паролем на вашем хранилище ключей.Независимо от вашего 'X509KeyManager', вам нужно будет загрузить закрытый ключ и сертификат из хранилища ключей после« псевдонима ». Вы можете посмотреть «обернуть» по умолчанию «X509KeyManager» и только переопределить свою логику для выбора псевдонима (вы можете использовать [this] (http://code.google.com/p/jsslutils/source/browse/trunk/jsslutils /src/main/java/org/jsslutils/sslcontext/keymanagers/FixedServerAliasKeyManager.java) в качестве отправной точки, кроме псевдонимов клиента). – Bruno

Смежные вопросы