WebService -Sicherheits- und Windows -Zertifikate
-
27-09-2019 - |
Frage
Ich möchte WebService -Anforderungen mit Apache CXF und WSS4J unterschreiben. Soweit ich weiß, würde ich einen JKS -Store benötigen, der das Zertifikat enthält, das ich zur Unterzeichnung verwenden möchte. Es besteht die Anforderung, ein X.509 -Zertifikat aus dem Windows -Zertifikatspeicher zu verwenden. Das Zertifikat wird zum Zeitpunkt der Unterzeichnung der WebService -Anfrage aus dem Geschäft gelesen. Ich weiß, wie man auf das Geschäft zugreift und das Zertifikat bekommt. Aber wie kann ich es zum Signieren anstelle des Zertifikats in meinem eigenen JKS -Geschäft verwenden?
Lösung
Der Keystore muss kein JKS sein. Sie können Ihren eigenen JCA -Anbieter schreiben und Keystorespi implementieren und auf den Windows -Zertifikatspeicher zugreifen.
Andere Tipps
Ansehen Dies Dies erklärt, wie Sie den Windows -Keystore verwenden. Anschließend müssen Sie CXF so konfigurieren, dass dieser Keystore verwendet wird.
Ich habe gerade festgestellt, dass es möglich ist, sie zu erreichen MerlinDevice
Klasse. So wird es gemacht:
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 so 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
Gibt einfach die konstante Zeichenfolge als Passwort zurück (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.