2016-12-30 68 views
0

對於幾天,我嘗試解決以下問題:的Apache CXF策略:安全配置無法檢測(外部政策)

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Security configuration could not be detected. Potential cause: Make sure jaxws:client element with name attribute value matching endpoint port is defined as well as a ws-security.signature.properties element within it. 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:158) 
    at com.sun.proxy.$Proxy38.getSignedDocument(Unknown Source) 
    at pl.mycompany.epuap.TPSigning_TPSigning_Client.main(TPSigning_TPSigning_Client.java:55) 
Caused by: org.apache.cxf.ws.policy.PolicyException: Security configuration could not be detected. Potential cause: Make sure jaxws:client element with name attribute value matching endpoint port is defined as well as a ws-security.signature.properties element within it. 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.policyNotAsserted(AbstractBindingBuilder.java:315) 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder.getSignatureBuilder(AbstractBindingBuilder.java:1851) 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AsymmetricBindingHandler.doSignature(AsymmetricBindingHandler.java:570) 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AsymmetricBindingHandler.doSignBeforeEncrypt(AsymmetricBindingHandler.java:149) 
    at org.apache.cxf.ws.security.wss4j.policyhandlers.AsymmetricBindingHandler.handleBinding(AsymmetricBindingHandler.java:98) 
    at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$PolicyBasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInterceptor.java:176) 
    at org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$PolicyBasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInterceptor.java:90) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272) 
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:572) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:481) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:382) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:335) 
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96) 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:136) 
    ... 2 more 

發生這種情況時,我嘗試調用Web服務:https://pz.gov.pl/pz-services/tpSigning?wsdl與外部(僅供參考)政策:https://pz.gov.pl/pz-services/tpSigning?wsdl=wssec-policies.wsdl

這裏是我的代碼:

Properties properties = new Properties(); 
properties.put("org.apache.ws.security.crypto.provider", "org.apache.ws.security.components.crypto.Merlin"); 
properties.put("org.apache.ws.security.crypto.merlin.keystore.type",config.getKeystoreType()); 
properties.put("org.apache.ws.security.crypto.merlin.keystore.password",config.getKeystorePass()); 
properties.put("org.apache.ws.security.crypto.merlin.keystore.alias",config.getKeystoreAlias()); 
properties.put("org.apache.ws.security.crypto.merlin.file", config.getKeystoreFile()); 

outProps.put("cryptoProperties",properties); 
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.TIMESTAMP + " " + WSHandlerConstants.SIGNATURE); 
//outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE); 
outProps.put(WSHandlerConstants.USER, config.getKeystoreAlias()); 
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordCallbackHandler.class.getName()); 
outProps.put(WSHandlerConstants.SIG_PROP_REF_ID,"cryptoProperties"); 
outProps.put(WSHandlerConstants.SIG_KEY_ID, "DirectReference"); 
outProps.put(WSHandlerConstants.SIGNATURE_PARTS, "{}{http://schemas.xmlsoap.org/soap/envelope/}Body"); 

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
cxfEndpoint.getOutInterceptors().add(wssOut); 

try{ 
    String s = signing.addDocumentToSigning(doc, succesUrl, failureUrl, additionalInfo); 
    return s; 
} 

正如我注意到,該政策並不受CXF引擎加載。我試圖通過攔截器加載策略,但效果是一樣的。

該問題也出現在2.7.18中,如3.x版本。

任何幫助將不勝感激。

問候 的Mariusz

回答

0

的問題是,你是混合 「行動」 爲基礎的方法的WS-Security和WS-SECURITYPOLICY驅動方式。您引用的WSDL包含一個安全策略,並且CXF PolicyBasedWSS4JOutInterceptor將自動負責基於此配置安全性。您只需指定一些安全配置選項,例如密鑰庫。詳情請看這裏:https://cxf.apache.org/docs/ws-securitypolicy.html