2011-11-23 76 views
0

请帮我解决此问题。在HTTPS上使用Web安全性调用SOAP服务时发生异常

我正在写一个java SOAP客户端来打击一些正在HTPPS上工作的第三方的SOAP服务&接受头部中的web-security。称为操作的soap服务反过来返回一个类对象。 我写了一个类,同时调用服务,我得到了异常。我试图获得SOAP信封,发送到服务&执行它与SOAP UI工具&获得了成功的响应。 我有点困惑什么是错误的,当我发送SOAP信封与我的JAVA SOAP客户端我得到下面的异常,同时使用SOAP UI工具运行相同的SOAP信封,我得到了成功的响应。

在线程异常 “主” AxisFault
的faultcode:{http://schemas.xmlsoap.org/soap/envelope/}MustUnderstand
faultSubcode: faultString:没明白"的mustUnderstand "报头(词):
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:
在org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96)
在org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
在org.apache。 axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767)
at org.apache.axis.client.Call.invoke( Call.java:1910)
在fibonacci.testing.TestService.main(TestService.java:92)

{http://xml.apache.org/axis/}hostname:localhost 

听不懂 “的mustUnderstand” 物管:
在org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96)
在org.apache.axis.client.AxisClient .invoke(AxisClient.java:206)
at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
at org.apache.axis.client.Call.invoke(Call.java:2767 )
在org.apache.axis.client.Call.invoke(Call.java:1910)
在fibonacci.testing.TestService.main(TestService.java:92)

回答

0

我面临这个问题,我已经解决了它在我的工作... 这种类型的消息是设置时,没有处理程序的安全性在您的服务器上。xsdd

在我的情况

的xsdd实现是建立在1.4轴使用的java.rmi和javax.xml.rpc.Service

,如果这是你的情况,你将有2 xsdd一个用于服务器(NS您的服务声明)以及您的调用的其他设置的deploy.xsdd。

首先,我添加到我的NS:操作绿洲安全这个引用,在那之后我加入到我的服务requestflow

它应该是这样的

<ns1:service name="YOUR SERVICE"> <!-- wss_username_token_over_ssl --> <requestFlow> 
<handler type="java:org.apache.ws.axis.security.WSDoAllReceiver"> 
    <parameter name="passwordCallbackClass" value=" YOUR PASSWORD HANDLER JAVA PATH LOCATION"/> 
    <parameter name="action" value="UsernameToken"/> 
</handler> </requestFlow> 
<ns1:operation name="YOUR OPERATION NAME" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
.... other declarations ... /> 

根据您的安全级别创建,在您的passwordCallbackClassHandler中,您必须/或不验证用户和密码 处理程序d是这样的

公共类PWCallback实现的CallbackHandler {

private static final byte[] key = { 
    (byte)0x31, (byte)0xfd, (byte)0xcb, (byte)0xda, 
    (byte)0xfb, (byte)0xcd, (byte)0x6b, (byte)0xa8, 
    (byte)0xe6, (byte)0x19, (byte)0xa7, (byte)0xbf, 
    (byte)0x51, (byte)0xf7, (byte)0xc7, (byte)0x3e, 
    (byte)0x80, (byte)0xae, (byte)0x98, (byte)0x51, 
    (byte)0xc8, (byte)0x51, (byte)0x34, (byte)0x04, 
    }; 

public void handle(Callback[] callbacks) 
     throws IOException, UnsupportedCallbackException { 
    System.out.println("DENTROOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"); 
     for (int i = 0; i < callbacks.length; i++) { 
      if (callbacks[i] instanceof WSPasswordCallback) { 
      WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; 
      /* 
      * here call a function/method to lookup the password for 
      * the given identifier (e.g. a user name or keystore alias) 
      * e.g.: pc.setPassword(passStore.getPassword(pc.getIdentfifier)) 
      * for testing we supply a fixed name/fixed key here. 
      */ 
      if (pc.getUsage() == WSPasswordCallback.KEY_NAME) { 
       pc.setKey(key); 
      } 
      else { 
       pc.setPassword("security"); 
      } 
      } else { 
      throw new UnsupportedCallbackException(
       callbacks[i], "Unrecognized Callback"); 
      } 
     } 
     } 

}

希望这可以帮助你 问候

相关问题