Ich verwende Apache CXF, um einen Web Service zu erstellen. Es verwendet Apache WSS4J, um WS-Sicherheitsfunktionen bereitzustellen. Ich muss eine SOAP-Anfrage machen und sie muss unterschrieben werden.Wie kann WSS4J das Schlüsselspeicherkennwort von einem Rückruf laden?
Dies ist der Inhalt der Eigenschaftendatei I WSS4J passieren:
org.apache.ws.security.crypto.provider = org.apache.ws.security.components.crypto.Merlin
org.apache.ws.security.crypto.merlin.keystore.type = PKCS12
org.apache.ws.security.crypto.merlin.keystore.provider = BC
org.apache.ws.security.crypto.merlin.keystore.password = 12345678
org.apache.ws.security.crypto.merlin.keystore.alias = my-alias
org.apache.ws.security.crypto.merlin.keystore.file = my_certificate.p12
ich dieser Linie loswerden möchte mit meinem Passwort im Klartext geschrieben. Ich entfernte diese Zeile und zur Verfügung gestellt, um meinen WSS4JOutInterceptor ein Passwort Callback-Handler, wie in dem obigen Code:
public SoapInterceptor newSignerInterceptor() {
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, config.getKeyAlias());
outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
outProps.put(WSHandlerConstants.USE_REQ_SIG_CERT, WSHandlerConstants.SIGNATURE_USER);
outProps.put(WSHandlerConstants.USE_SINGLE_CERTIFICATE, "false");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, this.getClass().getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE, config.getPropertiesFileName());
return new WSS4JOutInterceptor(outProps);
}
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof WSPasswordCallback) {
((WSPasswordCallback) callbacks[i]).setPassword(password);
}
}
}
Aber das hat nicht funktioniert. Es findet das Kennwort nicht in der Eigenschaftendatei und verwendet ein Standardkennwort "Sicherheit".
Wie kann man einen Rückruf verwenden, um das Passwort zu erhalten?
public class PasswordCallbackHandler implements CallbackHandler {
@Override
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
for(Callback callBack:callbacks){
if(callBack instanceof WSPasswordCallback){
((WSPasswordCallback)callBack).setPassword("password");
}
}
}
}
fügen Sie dann den Handler zu den Eigenschaften: