问题
我正在使用Apache CXF 3.0.7,并在new features中读取,您可以在加密属性文件中存储(BASE-64编码)密钥库密码的加密版本,但我不知道如何添加它,我没有找到这个实现的例子。
在apache网站上说:
Crypto属性文件内容的典型示例(for 签名创建)如下:
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=security
org.apache.wss4j.crypto.merlin.keystore.alias=wss40
org.apache.wss4j.crypto.merlin.keystore.file=keys/wss40.jks
请注意,用于加载密钥库的密码是明文。其中一个新的 Apache WSS4J 2.0.0的功能是能够存储一个 (BASE-64编码)加密版的密钥库密码 加密属性文件。定义了一个新的PasswordEncryptor接口 允许加密/解密密码。默认值 现在提供基于Jasypt的实现 JasyptPasswordEncryptor,它使用" PBEWithMD5AndTripleDES"。
WSPasswordCallback类还有一个"用法"叫 WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD,用于 返回主密码以与PasswordEncryptor一起使用 实现。当WSS4J通过一个加载Crypto实现时 属性文件,它遇到以格式加密的密码 " ENC(编码加密密码)",它向CallbackHandler查询a 密码通过此WSPasswordCallback使用标记。有可能通过 通过新的自定义PasswordEncryptor实现到WSS4J 配置标记ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE (" passwordEncryptorInstance&#34)。
可以将自定义PasswordEncryptor实现传递给 WSS4J通过新的配置标记 ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE (" passwordEncryptorInstance&#34)。
我想我必须在我的属性文件中声明类似的内容:
org.apache.wss4j.crypto.merlin.keystore.password=ENC(?????)
但我不知道如何使用默认的JasyptPasswordEncryptor加密我的密码。 另外,我猜想在我的CallbackHandler中我会有类似的东西:
if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){
????
}
解决方案
好的,测试运行后,我测试了我的解决方案,现在正在运行。
将编码输出放在属性
中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
在CallbackHandler中,输入您用于生成编码的master_password:
公共类WsPasswordHandler实现了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");
}
}
}
}
就是这样......现在我已经弄清楚如何使用Spring等外部local.property工作了......但这是另一个历史......谢谢!< / p>
答案 0 :(得分:4)
您可以通过使用主密码实例化JasyptPasswordEncryptor来获取加密密码,如测试中所示,并加密密钥库密码。然后将其复制到您的加密属性中:
科尔姆。