2015-06-06 39 views
3

我試圖外部化簽署SOAP CXF請求消息所需的crypto.properties文件。 根據框架,它應該在類路徑中有屬性文件。 我無法從外部加載它。請幫助我,我嘗試了很多技巧。如何從外部位置加載cxf wss4j加密屬性文件,而不是類路徑

我得到下面的異常

org.apache.ws.security.WSSecurityException:一般安全性錯誤(無法加載資源文件:

是十分必要的外部化的文件,因爲我們已經同步我們的開發和生產環境的代碼庫

使用

的CXF框架是2.6.10

+0

的框架CXF 2.6.10 – user3259812

+0

喔唷,崩潰啦,我也打這個,並且不能在CXF寄託。這是WSS4J的限制,IMO是一個嚴重的CM/Infosec限制。 WSHandlerConstants.SIG_PROP_FILE的語義是跛腳的。 –

+0

FWIW,使此https://issues.apache.org/jira/browse/WSS-540 –

回答

4

正如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; 
    } 
}; 
相關問題