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

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

我得到以下例外

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

我们已经同步了我们的开发和生产环境代码库,因此非常有必要对文件进行外部化

使用的CXF框架是2.6.10

最佳答案
如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;
  }
};

转载注明原文:java – 如何从类路径以外的外部位置加载cxf wss4j crypto属性文件 - 代码日志