2010-11-23 7 views
7

Ich möchte Webservice-Anforderungen unter Verwendung von Apache CXF und WSS4J signieren. Soweit ich weiß, würde ich einen JKS-Speicher benötigen, der das Zertifikat enthält, das ich zum Signieren verwenden möchte. Es gibt die Anforderung, ein X.509-Zertifikat aus dem Windows-Zertifikatspeicher verwenden zu können. Das Zertifikat muss zum Zeitpunkt der Unterzeichnung der Webservice-Anfrage aus dem Geschäft gelesen werden. Ich weiß, wie man auf das Geschäft zugreift und das Zertifikat erhält. Aber wie kann ich es zum Signieren anstelle des Zertifikats aus meinem eigenen JKS Store verwenden?Webservice-Sicherheit und Windows-Zertifikate

+0

Zertifikate werden nicht zum Signieren verwendet, Schlüssel sind. Haben Sie Zugang zu einem privaten Schlüssel? In diesem Fall können Sie tatsächlich etwas unterschreiben. –

Antwort

1

Der KeyStore muss kein JKS sein. Sie könnten Ihren eigenen JCA-Provider schreiben und KeyStoreSpi implementieren und auf den Windows-Zertifikatspeicher zugreifen.

+0

Haben Sie meine Antwort nützlich gefunden? – adrianboimvaser

0

Betrachten Sie this, die erläutert, wie Sie den Windows-Schlüsselspeicher verwenden. Dann müssen Sie CXF für die Verwendung dieses Keystores konfigurieren.

+0

Wie kann ich CXF mitteilen, dieses Geschäft zu verwenden? – tobiasbayer

+0

Es scheint keinen guten Weg zu geben, es zu tun. Es gibt einen Vorschlag, eine Java-COM-Bridge hier zu verwenden: http://objectmix.com/java/76948-accessing-certificates-windows-system-stores-java.html. Diese Antwort deutet darauf hin, dass Sie in JNI Hölle stecken bleiben: https://lists.owasp.org/pipermail/owasp-webscarbab/2010-October/001123.html – rtperson

+0

Wenn sie jedoch die Zertifikate in Active Directory speichern, dann ist es sind über LDAP und JNDI erreichbar. Das würde ich empfehlen. Lassen Sie mich wissen, ob Sie einen Beispielcode wünschen, und ich werde ihn als Antwort veröffentlichen. – rtperson

0

Nur gefunden, dass es möglich ist, mit MerlinDevice Klasse zu erreichen. Das ist, wie ihre getan:

1) Konfigurieren von Eigenschaften für 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) Die client_sign.properties Datei sieht wie folgt aus:

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) Und StupidCallback nur konstante String als zurück Passwort (sein Wert spielt keine Rolle):

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

Das ist alles.

Verwandte Themen