我試圖外部化簽署SOAP CXF請求消息所需的crypto.properties文件。 根據框架,它應該在類路徑中有屬性文件。 我無法從外部加載它。請幫助我,我嘗試了很多技巧。如何從外部位置加載cxf wss4j加密屬性文件,而不是類路徑
我得到下面的異常
org.apache.ws.security.WSSecurityException:一般安全性錯誤(無法加載資源文件:
是十分必要的外部化的文件,因爲我們已經同步我們的開發和生產環境的代碼庫
使用的CXF框架是2.6.10
我試圖外部化簽署SOAP CXF請求消息所需的crypto.properties文件。 根據框架,它應該在類路徑中有屬性文件。 我無法從外部加載它。請幫助我,我嘗試了很多技巧。如何從外部位置加載cxf wss4j加密屬性文件,而不是類路徑
我得到下面的異常
org.apache.ws.security.WSSecurityException:一般安全性錯誤(無法加載資源文件:
是十分必要的外部化的文件,因爲我們已經同步我們的開發和生產環境的代碼庫
使用的CXF框架是2.6.10
據支持,看到我的評論在這裏:https://issues.apache.org/jira/browse/WSS-540
正如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;
}
};
的框架CXF 2.6.10 – user3259812
喔唷,崩潰啦,我也打這個,並且不能在CXF寄託。這是WSS4J的限制,IMO是一個嚴重的CM/Infosec限制。 WSHandlerConstants.SIG_PROP_FILE的語義是跛腳的。 –
FWIW,使此https://issues.apache.org/jira/browse/WSS-540 –