WSDL Client Auth и несколько сертификатов - PullRequest
5 голосов
/ 26 ноября 2011

Итак, я столкнулся с небольшой проблемой с wsdls и выбором нескольких сертификатов в Java. Например, смарт-карта имеет несколько сертификатов для подписи, шифрования и идентификации. У меня есть WSDL, который генерирует код для подключения аутентификации клиента, но, насколько я могу судить, вы задаете wsdl путь к хранилищу ключей, устанавливая свойство, например,

  System.setProperty("javax.net.ssl.keyStore",
    keyStore);
  System.setProperty("javax.net.ssl.keyStorePassword",
    keyStorePassword);

Я следую этому учебнику . Теперь для нескольких сертификатов в хранилище ключей, как в смарт-карте, это представляет проблему, поскольку нет способа указать, какой сертификат вы хотите использовать на этой смарт-карте. Похоже, что wsdl выбирает первый сертификат в хранилище ключей, что может быть неверным сертификатом для аутентификации.

У меня вопрос в 2 раза:

  1. Есть ли другой способ, кроме System.setProperty, сообщить wsdl, какой сертификат использовать? Что я могу сделать, чтобы указать, какой сертификат, так как большая часть кода генерируется wsdl с использованием wsconsume?

  2. System.setProperty() позволяет только указать путь. Есть ли способ указать объект? Я получаю сертификаты со смарт-карты, используя класс SunPKCS11 (как указано здесь ). Однако это возвращает мне объект хранилища ключей, и, насколько я знаю, System.setProperty() хочет путь.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 30 декабря 2011

Я наконец нашел ответ на свой вопрос. Имейте в виду, я использую CXF.

Поэтому, когда я вызываю wsdl2java для wsdl, я получаю кучу сгенерированного кода. В частности, есть две части, которые обрабатывают авторизацию, точно названную Authorization и AuthorizationService. В моем коде для вызова этих ссылок я делаю следующее

AuthorizationService authSvc = new AuthorizationService();
Authorization authWs = authSvc.getAuthorizationPort();

На этом этапе вам необходимо создать свой собственный keyManager и trustmanager, создав новое хранилище ключей из выбранного сертификата. Хорошее место для начала - это

Тогда вам нужно построить TLSClientParameters

TLSClientParameters params = new TLSClientParameters();
params.setKeyManagers(keyManagers);
params.setTrustManagers(trustManagers);

Затем создайте свой HTTPConduit.

HTTPConduit conduit = (HTTPConduit) ClientProxy.getClient(authWs).getConduit();
conduit.setTlsClientParameters(params);

И затем вы можете использовать свой веб-сервис с сертификатом, выбранным вашим пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...