2009-02-12 9 views
7

Estoy intentando acceder a un servicio web protegido por un certificado. La seguridad está configurada en IIS y el servicio web está detrás de esto.¿Cómo se usa la autenticación HLS de TLS/SSL con un cliente CXF en un servicio web?

No creo que WS-SECURITY haga este tipo de autenticación. ¿Hay alguna forma de pasar el certificado del cliente cuando llama al servicio web?

Acabo de recibir una página de error de IIS que dice "La página requiere un certificado de cliente ".

estoy usando CXF 2.1.4

Respuesta

7

Sí, esto es posible usando CXF. Tendrá que configurar el conducto del cliente. Puede especificar el almacén de claves que contiene los certificados que le permitirán acceder al servicio web en IIS. Siempre que el certificado que está utilizando aquí sea un cliente permitido conocido en IIS, debería estar bien.

<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> 

Muestra de: CXF Wiki

1

encima respuesta es correcta, pero añadiendo a eso ....

su grano de cliente debe ser de la siguiente manera (SSL para este trabajo fino):

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

Si define el bean de cliente como sigue SSL no funcionará:

<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

Para hacerlo en forma programática, crea un interceptor y agrégalo a tu JaxWsProxyFactoryBean con 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); 
      } 
     } 
} 
Cuestiones relacionadas