2009-02-12 2 views
7

Я пытаюсь получить доступ к веб-службе, защищенной сертификатом. Безопасность установлена ​​в IIS, и за ней стоит веб-служба.Как использовать TLS/SSL Http Authentication с клиентом CXF для веб-службы?

Я не думаю, что WS-SECURITY выполнит этот тип аутентификации. Есть ли способ передать сертификат клиента при вызове веб-службы?

Я просто получаю страницу с ошибкой IIS, в которой говорится: «На странице требуется сертификат клиента ».

Я использую CXF 2.1.4

ответ

7

Да, это возможно с помощью CXF. Вам нужно будет настроить клиентский канал. Вы можете указать хранилище ключей, которое содержит сертификаты, которые позволят вам получить доступ к веб-службе в IIS. Пока сертификат, который вы используете здесь, является известным разрешенным клиентом в IIS, вы должны быть в порядке.

<http:conduit name="{http://apache.org/hello_world}HelloWorld.http-conduit"> 

    <http:tlsClientParameters> 
     <sec:keyManagers keyPassword="password"> 
      <sec:keyStore type="JKS" password="password" 
       file="src/test/java/org/apache/cxf/systest/http/resources/Morpit.jks"/> 
     </sec:keyManagers> 
     <sec:trustManagers> 
      <sec:keyStore type="JKS" password="password" 
       file="src/test/java/org/apache/cxf/systest/http/resources/Truststore.jks"/> 
     </sec:trustManagers> 

     ... 

    </http:tlsClientParameters> 

Пример из: CXF Wiki

1

Над ответом является правильным, но добавление к этому ....

Ваш клиент боб должен быть следующим (для этого SSL работает отлично):

<jaxws:client id="helloClient" serviceClass="demo.spring.HelloWorld" address="http://localhost:9002/HelloWorld" /> 

Если вы определяете клиентский компонент, следующий SSL не будет работать:

<bean id="proxyFactory" 
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> 
<property name="serviceClass" value="demo.spring.HelloWorld"/> 
<property name="address" value="http://localhost:9002/HelloWorld"/> 
</bean> 
0

Чтобы сделать это программно, создайте перехватчик и добавьте его в ваш JaxWsProxyFactoryBean с помощью factory.getOutInterceptors().add(new TLSInterceptor()).

public class TLSInterceptor extends AbstractPhaseInterceptor<Message> { 

    public TLSInterceptor() { 
     super(Phase.SETUP); 
    } 

    @Override 
    public void handleMessage(final Message message) throws Fault { 
      final Conduit conduit = message.getExchange().getConduit(message); 
      if (conduit instanceof HTTPConduit) { 
       final HTTPConduit httpConduit = (HTTPConduit) conduit; 
       final TLSClientParameters tlsClientParameters = ObjectUtils.firstNonNull(httpConduit.getTlsClientParameters(), new TLSClientParameters()); 

       // configure the params 

       httpConduit.setTlsClientParameters(tlsClientParameters); 
      } 
     } 
} 
Смежные вопросы