2010-11-23 29 views
7

Deseo firmar solicitudes de servicios web utilizando Apache CXF y WSS4J. Por lo que sé, necesitaría una tienda JKS que contenga el certificado que quiero usar para firmar. Existe el requisito de poder usar un certificado X.509 del almacén de certificados de Windows. El certificado debe leerse en la tienda al momento de firmar la solicitud del servicio web. Sé cómo acceder a la tienda y obtener el certificado. ¿Pero cómo puedo usarlo para firmar en lugar del certificado de mi propia tienda JKS?Seguridad de servicios web y certificados de Windows

+0

Los certificados no se utilizan para firmar, las claves sí lo están. ¿Tiene acceso a una clave privada? En ese caso, puedes firmar algo. –

Respuesta

1

KeyStore no necesita ser un JKS. Puede escribir su propio proveedor JCA e implementar KeyStoreSpi, y hacer que acceda al almacén de certificados de Windows.

+0

¿Encuentras mi respuesta útil? – adrianboimvaser

0

Mire this que explica cómo usar el almacén de claves de Windows. Luego debe configurar CXF para usar ese almacén de claves.

+0

¿Cómo puedo decirle a CXF que use esa tienda? – tobiasbayer

+0

No parece haber una buena manera de hacerlo. Se sugiere utilizar un puente Java-COM aquí: http://objectmix.com/java/76948-accessing-certificates-windows-system-stores-java.html. Esta respuesta sugiere que estarás atrapado en JNI hell: https://lists.owasp.org/pipermail/owasp-webscarab/2010-October/001123.html – rtperson

+0

Sin embargo, si almacenan los certificados en Active Directory, entonces Se podrá acceder a través de LDAP y JNDI. Eso es lo que recomendaría. Avíseme si desea algún código de muestra y lo publicaré como respuesta. – rtperson

0

Acabo de encontrar que es posible lograr usando la clase MerlinDevice. Eso es como se hace:

1) Configuración de las propiedades de 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) El archivo client_sign.properties se parece a esto:

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.

Cuestiones relacionadas