2013-04-15 3 views
6

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:

Antwort

5

Sie können eine CallbackHandler implementieren

outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordCallbackHandler.class); 

Sie können auch PW_CALLBACK_REF eine Referenz des Handlers zu setzen.

-1

Merlin ruft den Rückruf für das Keystore-Kennwort nicht auf, daher muss sich das Kennwort immer in der Eigenschaftendatei befinden. Zum Glück kann es verschlüsselt werden.

Die Lösung ist schön hier beschrieben: Encrypting passwords in Crypto property files

Kopierte Lösung aus dem obigen Link:

  1. die jasypt-1.9.2-dist.zip Herunterladen
  2. ein Verschlüsselte Passwort mit dieser Get Befehl encrypt input=real_keystore_password password=master_password algorithm=PBEWithMD5AndTripleDES
  3. Kopieren Sie den OUTPUT (Beispiel: 0laAaRahTQJzlsDu771tYi)
  4. Wie Sie diese algorith verwenden m, du brauchst die Java Cryptography Erweiterung (JCE) Unlimited Strength. Setze dein JDK ein.
  5. Setzen Sie die codierte Ausgabe in den Eigenschaften

    org.apache.wss4j.crypto.provider=org.apache.wss4j.common.crypto.Merlin 
    
    org.apache.wss4j.crypto.merlin.keystore.type=jks 
    org.apache.wss4j.crypto.merlin.keystore.password=ENC(0laAaRahTQJzlsDu771tYi) 
    
    org.apache.wss4j.crypto.merlin.keystore.alias=my_alias 
    org.apache.wss4j.crypto.merlin.keystore.file=/etc/cert/my_keystore.jks 
    
  6. Im Callbackhandler, legte die master_password wich Sie die codierte ein bis erzeugt verwendet:

    public class WsPasswordHandler implements CallbackHandler { 
    @Override 
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { 
    
        for (Callback callback: callbacks){ 
         WSPasswordCallback pwdCallback= (WSPasswordCallback) callback; 
         final int usage =pwdCallback.getUsage(); 
         if (usage == WSPasswordCallback.SIGNATURE || usage==WSPasswordCallback.DECRYPT) { 
         pwdCallback.setPassword("parKeyPassword"); 
        } 
        if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){ 
         pwdCallback.setPassword("master_password"); 
        } 
        }   
    } 
    

    }

Verwandte Themen