【问题标题】:How to make WSS4J load the keystore password from a callback?如何让 WSS4J 从回调中加载密钥库密码?
【发布时间】:2013-04-15 22:20:17
【问题描述】:

我正在使用 Apache CXF 构建 Web 服务。它使用 Apache WSS4J 来提供 WS-Security 功能。我需要发出一个 SOAP 请求并且它必须被签名。

这是我传递给 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);
        }
    }
}

但这没有用。它在属性文件中找不到密码并使用默认密码“security”。

如何让它使用回调来获取密码?

【问题讨论】:

    标签: java cxf ws-security wss4j


    【解决方案1】:

    你可以实现一个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 来设置处理程序的引用。

    【讨论】:

      【解决方案2】:

      Merlin 不会为 Keystore 密码调用回调,因此密码始终必须在属性文件中。幸运的是它可以被加密。

      这里很好地描述了解决方案: 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. 复制输出(例如:0laAaRahTQJzlsDu771tYi)
      4. 在使用此算法时,您需要 Java Cryptography 扩展 (JCE) 无限强度。放入你的 JDK。
      5. 将编码后的输出放入属性中

        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. 在 CallbackHandler 中,输入您以前使用的 master_password 生成编码的:

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

        }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多