2010-11-23 4 views
7

Je souhaite signer des demandes de service Web à l'aide d'Apache CXF et de WSS4J. Pour autant que je sache, j'aurais besoin d'un magasin JKS contenant le certificat que je veux utiliser pour signer. Vous devez pouvoir utiliser un certificat X.509 du magasin de certificats Windows. Le certificat doit être lu dans le magasin au moment de la signature de la demande de service Web. Je sais comment accéder au magasin et obtenir le certificat. Mais comment puis-je l'utiliser pour signer à la place du certificat de mon propre magasin JKS?Webservice Security et certificats Windows

+0

Les certificats ne sont pas utilisés pour la signature, les clés sont. Avez-vous accès à une clé privée? Dans ce cas, vous pouvez réellement signer quelque chose. –

Répondre

1

Le KeyStore n'a pas besoin d'être un JKS. Vous pouvez écrire votre propre fournisseur JCA et implémenter KeyStoreSpi, et avoir accès au magasin de certificats Windows.

+0

Avez-vous trouvé ma réponse utile? – adrianboimvaser

0

Examinez this pour savoir comment utiliser le fichier de clés Windows. Ensuite, vous devez configurer CXF pour utiliser ce fichier de clés.

+0

Comment puis-je demander à CXF d'utiliser ce magasin? – tobiasbayer

+0

Il ne semble pas y avoir de bon moyen de le faire. Il existe une suggestion pour utiliser un pont Java-COM ici: http://objectmix.com/java/76948-accessing-certificates-windows-system-stores-java.html. Cette réponse suggère que vous serez bloqué dans l'enfer JNI: https://lists.owasp.org/pipermail/owasp-webscarab/2010-October/001123.html – rtperson

+0

Cependant, s'ils stockent les certs dans Active Directory, alors il sera accessible via LDAP et JNDI. C'est ce que je recommanderais. Faites-moi savoir si vous souhaitez un exemple de code, et je l'afficherai comme réponse. – rtperson

0

Je viens de trouver qu'il est possible d'atteindre en utilisant MerlinDevice classe. Voilà comment son fait:

1) Configuration des propriétés pour 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) Le fichier client_sign.properties ressemble à ceci:

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) Et StupidCallback juste retourne constante chaîne comme mot de passe (sa valeur n'a pas vraiment d'importance):

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

C'est tout.