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

Java 如何从类路径以外的外部位置加载cxf wss4j加密属性文件,java,web-services,cxf,Java,Web Services,Cxf,我正在尝试外部化crypto.properties文件,这是签署SOAP CXF请求消息所需的文件。 根据框架,它应该在类路径中有属性文件。 我无法从外部加载它。请帮帮我,我试过很多技巧 我得到下面的例外 org.apache.ws.security.WSSecurityException:一般安全错误(无法加载资源文件: 由于我们已经同步了开发和生产环境代码库,所以非常有必要将文件外部化 所使用的CXF框架是2.6.10它是受支持的,请参见我的评论:正如Colm O Heigerataigh的

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

我得到下面的例外

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

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


所使用的CXF框架是2.6.10

它是受支持的,请参见我的评论:

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

您还可以在内存中构造Properties对象,并让CXF使用它。这也适用于较旧的CXF版本。这可以通过扩展
WSS4JInInterceptor
WSS4JOutInterceptor
,然后重写
Crypto LoadCryptoFromProperties文件(String propFilename,RequestData reqData)
方法并返回您自己的
加密对象,您可以使用
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;
  }
};
Properties cxfProps=新属性();
setProperty(“org.apache.ws.security.crypto.provider”、“org.apache.ws.security.components.crypto.Merlin”);
setProperty(“org.apache.ws.security.crypto.merlin.keystore.type”,“jks”);
setProperty(“org.apache.ws.security.crypto.merlin.keystore.alias”,“client”);
setProperty(“org.apache.ws.security.crypto.merlin.keystore.password”,password);
setProperty(“org.apache.ws.security.crypto.merlin.keystore.file”、“keystore.j2”);
Crypto Crypto=CryptoFactory.getInstance(cxfProps);
Map inProps=newhashmap();
Map outProps=new HashMap();
inProps.put(WSHandlerConstants.ACTION,“签名”);
inProps.put(WSHandlerConstants.SIG_PROP_文件,“dummy_值”);//仅用于避免NPE
outProps.put(WSHandlerConstants.ACTION,“签名”);
outProps.put(WSHandlerConstants.USER,“客户端”);
outProps.put(WSHandlerConstants.SIG_PROP_文件,“dummy_值”);//仅为避免NPE而必需
WSS4JIN拦截器wssIn=新的WSS4JIN拦截器(inProps){
@凌驾
受保护的Crypto loadCryptoFromPropertiesFile(字符串propFilename,RequestData reqData)
抛出WSSecurityException{
返回密码;
}
};
WSS4JOutInterceptor wssOut=新WSS4JOutInterceptor(输出程序){
@凌驾
受保护的Crypto loadCryptoFromPropertiesFile(字符串propFilename,RequestData reqData)
抛出WSSecurityException{
返回密码;
}
};

该框架是cxf 2.6.10Aw snap,我也遇到了这个问题,不能固定在cxf上。这是WSS4J的限制,我认为是严重的CM/Infosec限制。WSHandlerConstants.SIG_PROP_文件的语义是lame.FWIW,因此您可能应该添加一些有关运行时环境的更多信息。您是否在应用程序上运行此文件服务器?