我正在尝试外部化签名SOAP CXF请求消息所需的crypto.properties文件。 根据框架,它应该在类路径中具有属性文件。 我无法从外部加载它。请帮助我,我尝试了很多技巧。
我收到以下异常
org.apache.ws.security.WSSecurityException:一般安全性错误(无法加载资源文件:
因为我们已经同步了我们的开发和生产环境代码库,所以非常有必要外化文件
使用的CXF框架是2.6.10
答案 0 :(得分:6)
正如Colm O hEigeartaigh所说,可以使用最新版本的CXF和WSS4J从外部文件加载配置设置。但是,这仍然意味着需要将属性写入文件并再次加载它们。
您还可以在内存中构造一个Properties对象,并让CXF使用它。这也适用于较旧的CXF版本。这是通过扩展WSS4JInInterceptor
和WSS4JOutInterceptor
,然后覆盖Crypto loadCryptoFromPropertiesFile(String propFilename, RequestData reqData)
方法并返回您自己的Crypto
对象来完成的,您可以使用CryptoFactory.getInstance(properties)
创建该对象。
类似于:
Properties cxfProps = new Properties();
cxfProps.setProperty("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin");
cxfProps.setProperty("org.apache.ws.security.crypto.merlin.keystore.type", "jks");
cxfProps.setProperty("org.apache.ws.security.crypto.merlin.keystore.alias", "client");
cxfProps.setProperty("org.apache.ws.security.crypto.merlin.keystore.password", PASSWORD);
cxfProps.setProperty("org.apache.ws.security.crypto.merlin.keystore.file", "keystore.j2");
Crypto crypto = CryptoFactory.getInstance(cxfProps);
Map<String, Object> inProps = new HashMap<String, Object>();
Map<String, Object> outProps = new HashMap<String, Object>();
inProps.put(WSHandlerConstants.ACTION, "Signature");
inProps.put(WSHandlerConstants.SIG_PROP_FILE, "dummy_value"); // Only necessary to avoid NPE
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, "client");
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "dummy_value"); // Only necessary to avoid NPE
WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps) {
@Override
protected Crypto loadCryptoFromPropertiesFile(String propFilename, RequestData reqData)
throws WSSecurityException {
return crypto;
}
};
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps) {
@Override
protected Crypto loadCryptoFromPropertiesFile(String propFilename, RequestData reqData)
throws WSSecurityException {
return crypto;
}
};
答案 1 :(得分:2)