Pregunta

Estoy intentando acceder a un servicio web asegurado por un certificado. La seguridad es de configuración en IIS y el servicio web está detrás de él.

No creo WS-Security va a hacer este tipo de autenticación. ¿Hay alguna manera de pasar el certificado de cliente cuando se llama al servicio web?

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

Estoy usando CXF 2.1.4

¿Fue útil?

Solución

Sí, esto es posible usando CXF. Usted tendrá que configurar el conducto cliente. Se puede especificar el almacén de claves que contiene los certificados que permitan el acceso al servicio web en IIS. Mientras el certificado que está utilizando aquí es un cliente conocido permitido en IIS, debe 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>

Ejemplo de: CXF Wiki

Otros consejos

Sobre la 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 se define el grano de cliente de la siguiente manera 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> 

Según lo mencionado por @geg necesita añadir a su interceptor JaxWsProxyFactoryBean y utilizar HttpConduit.

Aquí es el código de ejemplo se puede hacer referencia.
este código guiará cómo configurar TLSClientParameters

Para hacerlo en programáticamente, crear un interceptor y añadirlo a su 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);
            }
        }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top