Pregunta

Quiero firmar solicitudes de servicio web utilizando Apache CXF y WSS4J. Por lo que sé, lo que necesitaría un JKS memoria que contiene el certificado que quiero usar para firmar. Ahí está el requisito de ser capaz de utilizar un certificado X.509 del almacén de certificados de Windows. El certificado deberá ser leído desde la tienda en el momento de la firma de la solicitud de servicio web. Yo sé cómo acceder a la tienda y obtener el certificado. Pero, ¿cómo lo puedo usar para firmar en lugar del certificado de mi propia tienda JKS?

¿Fue útil?

Solución

El almacén de claves no tiene que ser una JKS. Usted puede escribir su propio proveedor de JCA e implementar KeyStoreSpi, y tienen que acceder al almacén de certificados de Windows.

Otros consejos

que explica cómo utilizar las ventanas de almacén de claves. Entonces usted tiene que configurar CXF para utilizar ese almacén de claves.

Sólo se encontró que es posible de lograr con la clase MerlinDevice. Así es como su hacer:

1) Configuración de las propiedades para WSS4JOutInterceptor:

Map<String,Object> outProps = new HashMap<String,Object>();
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, "Friendly_name_of_your_certificate");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, StupidCallback.class.getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "client_sign.properties");
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);

2) Los archivos client_sign.properties es similar al siguiente:

org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.MerlinDevice
keystore.provider=SunMSCAPI
cert.provider=SunMSCAPI
keystore.type=Windows-MY
truststore.type=Windows-ROOT

3) Y StupidCallback sólo devuelve constante de cadena como una contraseña (su valor en realidad no importa):

public class StupidCallback implements CallbackHandler
{
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
    {
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        pc.setPassword("password");
    }
}

Eso es todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top