1. 程式人生 > >XFire中實現WS-Security時出現的異常及原因

XFire中實現WS-Security時出現的異常及原因

XFire中實現WS-Security時出現的異常及原因:

1.缺包,在客戶端新增xalan.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/xml/utils/URI$MalformedURIException

at org.apache.ws.security.message.WSSecSignature.prepare(WSSecSignature.java:350)

at org.apache.ws.security.message.WSSecSignature.build(WSSecSignature.java:703

)

at org.apache.ws.security.action.SignatureAction.execute(SignatureAction.java:54)

at org.apache.ws.security.handler.WSHandler.doSenderAction(WSHandler.java:192)

at org.codehaus.xfire.security.wss4j.WSS4JOutHandler.invoke(WSS4JOutHandler.java:158)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(

HandlerPipeline.java:131)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)

at org.codehaus.xfire.client.Client.invoke(Client.java:336)

at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)

at org.codehaus.xfire.client.XFireProxy.invoke(

XFireProxy.java:57)

at $Proxy0.test(Unknown Source)

at keytool.TestClient.main(TestClient.java:69)

2.在呼叫服務端方法前未新增Handler,沒有對報頭新增資訊

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: WSS4JInHandler: Request does not contain required Security header

org.codehaus.xfire.fault.XFireFault: WSS4JInHandler: Request does not contain required Security header

at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)

at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.client.Client.onReceive(Client.java:406)

at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)

at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)

at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)

at org.codehaus.xfire.client.Client.invoke(Client.java:336)

at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)

at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)

at $Proxy0.getList(Unknown Source)

at keytool.TestClient.main(TestClient.java:46)

如果是基於使用者名稱密碼的可能報的是這樣的錯:

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 請求必須包含驗證資訊
org.codehaus.xfire.fault.XFireFault: 
請求必須包含驗證資訊
    at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
    at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
    at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
    at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
    at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
    at org.codehaus.xfire.client.Client.invoke(Client.java:336)
    at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
    at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
    at $Proxy0.getUser(Unknown Source)
    at test.ClientTest.main(ClientTest.java:35)

就是代表驗證不合法,拒絕提供服務。

3.安裝對應JDK 版本的Unlimited Strength Jurisdiction策略檔案. 策略檔案包括local_policy.jarUS_export_policy.jar檔案,將其拷貝到<JAVA_HOME>/jre/lib/security目錄下。

你可以從http: //java.sun.com/j2se/1.5.0/download.jsp http://java.sun.com/j2se/1.4.2/download.html頁面的底部找到下載的連結。否則在使用WS- Security時,可以會丟擲java.security.InvalidKeyException: Illegal key size的錯誤資訊。

4.安裝SecurityProvider

WSS4J使用了BouncyCastleSecurityProvider,所以需要事先在java.security檔案中進行配置,否則運 行加密模式的XFire認證時,會丟擲以下的出錯資訊:org.apache.ws.security.WSSecurityException: An unsupported signature or encryption algorithm was used unsupported key

java.security檔案中(位於<JAVA_HOME>/jre/lib/security目錄中)新增BouncyCastleProvider的配置:

security.provider.1=sun.security.provider.Sun

security.provider.2=sun.security.rsa.SunRsaSign

security.provider.3=com.sun.net.ssl.internal.ssl.Provider

security.provider.4=com.sun.crypto.provider.SunJCE

security.provider.5=sun.security.jgss.SunProvider

security.provider.6=com.sun.security.sasl.Provider

security.provider.7=org.bouncycastle.jce.provider.BouncyCastleProvider

5.配置檔案裡缺少<inHandlers>.... </inHandlers>這段配置或者這段配置有問題。

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Header {Security}http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd was not undertsood by the service.

org.codehaus.xfire.fault.XFireFault: Header {Security}http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd was not undertsood by the service.

at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)

at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.client.Client.onReceive(Client.java:406)

at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)

at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)

at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)

at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)

at org.codehaus.xfire.client.Client.invoke(Client.java:336)

at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)

at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)

at $Proxy0.test(Unknown Source)

at keytool.TestClient.main(TestClient.java:69)

Fault occurred!

org.codehaus.xfire.fault.XFireFault: Header {Security}http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd was not undertsood by the service.

at org.codehaus.xfire.soap.handler.ValidateHeadersHandler.assertUnderstandsHeader(ValidateHeadersHandler.java:76)

at org.codehaus.xfire.soap.handler.ValidateHeadersHandler.invoke(ValidateHeadersHandler.java:53)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)

at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)

at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)

at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)

at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)

at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)

at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

at java.lang.Thread.run(Thread.java:595)

6.配置檔案。。.propertiesorg.apache.ws.security.crypto.merlin.file有錯

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: org.apache.ws.security.components.crypto.Merlin cannot create instance

org.codehaus.xfire.fault.XFireFault: org.apache.ws.security.components.crypto.Merlin cannot create instance

at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)

at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)

at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)

at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)

at org.codehaus.xfire.client.Client.onReceive(Client.java:406)

at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)

7. Unexpected close tag </body>; expected </HR>.服務端缺少xalan.jar

15:27:36,062 ERROR [STDERR] org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected close tag </body>; expected </HR>.
 at [row,col {unknown-source}]: [1,1013]
15:27:36,062 ERROR [STDERR] org.codehaus.xfire.fault.XFireFault: Unexpected close tag </body>; expected </HR>.
 
at [row,col {unknown-source}]: [1,1013]
15:27:36,062 ERROR [STDERR]  at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
15:27:36,062 ERROR [STDERR]  
at org.codehaus.xfire.client.Client.onReceive(Client.java:386)

8. java.lang.NoClassDefFoundError: org/apache/xml/serializer/TreeWalker錯誤原因:原本這個類是包含在xalan.jar中的,但是xalan-j2.7.0版的釋出包中,將serializer包中的類單獨打包成serializer.jar,不再包含在xalan.jar中,所以才會即使添加了xalan.jar也無法找到該類,新增後即可解決問題。新增到服務端。

錯誤內容如下:Unrecognized xbean element mapping: services in namespace  .
經過分析得出XFire1.26需要xalan.jar包的支援.因此要新增xalan.jar

錯誤一:

15:27:36,062 ERROR [STDERR] org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: Unexpected close tag </body>; expected </HR>.
 at [row,col {unknown-source}]: [1,1013]
15:27:36,062 ERROR [STDERR] org.codehaus.xfire.fault.XFireFault: Unexpected close tag </body>; expected </HR>.
 at [row,col {unknown-source}]: [1,1013]
15:27:36,062 ERROR [STDERR]  at org.codehaus.xfire.fault.XFireFault.createFault(XFireFault.java:89)
15:27:36,062 ERROR [STDERR]  at org.codehaus.xfire.client.Client.onReceive(Client.java:386)

解決方法:呼叫的地址寫錯了。這個原因好像不對,在我的專案中遇到這個問題,竟然是因為服務端缺少xalan.jar

錯誤二:

Caused by: java.lang.IllegalAccessException: Class org.codehaus.xfire.service.invoker.LocalFactory can not access a member of class

解決方法:介面實現類不是public 的,所以不能例項化。

錯誤三:java.io.CharConversionException: Invalide char #a323

解決方法:試試新增 xfire 1.1 miscellaneous

9.org.codehaus.xfire.XFireRuntimeException:   Could   not   invoke   service..   Nested   exception   is   org.codehaus.xfire.fault.XFireFault:   There   must   be   a   method   name   element.

2007-07-17   14:31:19,656   DEBUG   org.codehaus.xfire.handler.HandlerPipeline   -   Invoking   handler   org.codehaus.xfire.client.ClientReceiveHandler   in   phase   service
org.codehaus.xfire.XFireRuntimeException:   Could   not   invoke   service..   Nested   exception   is   org.codehaus.xfire.fault.XFireFault:   There   must   be   a   method   name   element.
org.codehaus.xfire.fault.XFireFault:   There   must   be   a   method   name   element.
at   org.codehaus.xfire.service.binding.WrappedBinding.readMessage(WrappedBinding.java:32)
at   org.codehaus.xfire.soap.handler.SoapBodyHandler.invoke(SoapBodyHandler.java:42)
at   org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at   org.codehaus.xfire.client.Client.onReceive(Client.java:406)
at   org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
at   org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
at   org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
at   org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
at   org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
at   org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
at   org.codehaus.xfire.client.Client.invoke(Client.java:336)
at   org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
at   org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
at   $Proxy4.callCrmService(Unknown   Source)
at   webservice.client.TestClient.test1(TestClient.java:58)
at   webservice.client.TestClient.main(TestClient.java:104)

原因:URL寫錯了:
把  “http://localhost:8080/x/services/xxx.wsdl"
改為“http://localhost:8080/x/services/xxx"