如何从类路径以外的外部位置加载cxf wss4j crypto属性文件

时间:2015-06-06 17:49:26

标签: java web-services cxf

我正在尝试外部化签名SOAP CXF请求消息所需的crypto.properties文件。 根据框架,它应该在类路径中具有属性文件。 我无法从外部加载它。请帮助我,我尝试了很多技巧。

我收到以下异常

org.apache.ws.security.WSSecurityException:一般安全性错误(无法加载资源文件:

因为我们已经同步了我们的开发和生产环境代码库,所以非常有必要外化文件

使用的CXF框架是2.6.10

2 个答案:

答案 0 :(得分:6)

正如Colm O hEigeartaigh所说,可以使用最新版本的CXF和WSS4J从外部文件加载配置设置。但是,这仍然意味着需要将属性写入文件并再次加载它们。

您还可以在内存中构造一个Properties对象,并让CXF使用它。这也适用于较旧的CXF版本。这是通过扩展WSS4JInInterceptorWSS4JOutInterceptor,然后覆盖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)

支持,请参阅我的评论:https://issues.apache.org/jira/browse/WSS-540