Problem
我正在使用 Apache CXF 3.0.7,并在新功能您可以在加密属性文件中存储密钥库密码的(BASE-64 编码)加密版本,但我不知道如何添加它,我没有找到此实现的示例。
在 apache web 中说:
加密属性文件内容的典型示例(例如
签名创建)如下:
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 查询
通过此 WSPasswordCallback 使用标记获取密码。是可以通过的
通过新的 WSS4J 的自定义 PasswordEncryptor 实现
配置标签ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE
(“密码加密实例”)。
可以将自定义的PasswordEncryptor实现传递给
WSS4J 通过新的配置标签
ConfigurationConstants.PASSWORD_ENCRYPTOR_INSTANCE
(“密码加密实例”)。
我想我必须在我的属性文件中声明类似的内容:
org.apache.wss4j.crypto.merlin.keystore.password=ENC(?????)
但我不知道如何使用默认实现的 JasyptPasswordEncryptor 来加密我的密码。
另外,我想在我的 CallbackHandler 中我会有类似的东西:
if (usage==WSPasswordCallback.PASSWORD_ENCRYPTOR_PASSWORD){
????
}
Solution
好的,随着测试的运行,我测试了我的解决方案,现在正在工作。
- 下载jasypt-1.9.2-dist.zip
- 使用此命令获取编码密码
加密输入=real_keystore_password 密码=master_password 算法=PBEWithMD5AndTripeDES
- 复制输出(例如:0laAaRahTQJzlsDu771tYi)
- 当您使用此算法时,您需要 Java 加密扩展 (JCE) 无限强度。放入你的 JDK。
-
将编码输出放入属性中
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");
}
}
}
}
就是这样......现在我必须弄清楚如何在外部 local.property 中使用 Spring 等等来使其工作......但这是另一段历史......谢谢!