2013-04-15 6 views
6

Apache CXFを使用してWebサービスを構築しています。 Apache WSS4Jを使用してWS-Security機能を提供します。私はSOAPリクエストを作成する必要があり、署名が必要です。WSS4Jがコールストアからキーストアのパスワードをロードする方法を教えてください。

これは、プロパティの内容ですが、私はWSS4Jに渡すファイル:

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 

私は自分のパスワードプレーンテキストとして書いたと、その行を取り除きたいです。私は、その行を削除し、上記のコードのように、私のWSS4JOutInterceptorにパスワードコールバックハンドラを提供:

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); 
     } 
    } 
} 

しかし、それは動作しませんでした。プロパティー・ファイルでパスワードを検出せず、デフォルトのパスワード「セキュリティー」を使用します。

パスワードを取得するコールバックを使用するにはどうすればいいですか?

答えて

5

あなたはCallbackHandlerを実装することができます。

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"); 
      } 
     } 
    } 
} 

その後、プロパティにハンドラを追加します。

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

あなたはまた、ハンドラの参照を設定するPW_CALLBACK_REFを使用することができます。

-1

Merlinはキーストアのパスワードのコールバックを呼び出さないので、パスワードは常にプロパティファイルになければなりません。幸いにもそれは暗号化することができます。

ソリューションはうまくここで説明されています Encrypting passwords in Crypto property files

上記のリンクから

コピーしたソリューション:

  1. はこれでエンコードされたパスワードを取得しますjasypt-1.9.2-dist.zip
  2. をダウンロードコマンドencrypt input=real_keystore_password password=master_password algorithm=PBEWithMD5AndTripleDES
  3. OUTPUT(例:0laAaRahTQJzlsDu771tYi)をコピーする
  4. このアルゴリズムを使用しているのでJava暗号化 拡張(JCE)無制限強度が必要です。あなたのJDKを入れてください。
  5. のCallbackHandlerで

    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. プロパティでエンコードされた出力を入れ、master_passwordを入れて、あなたは に使用WICHエンコードされたものを生成:

    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"); 
        } 
        }   
    } 
    

    }

関連する問題