使用Web安全性在HTTPS上调用SOAP服务时获取异常

时间:2011-11-23 09:22:46

标签: java soap security web axis

请帮我解决这个问题。

我正在编写一个java SOAP客户端来点击某个正在使用HTPPS&的第三方的SOAP服务。接受标题中的web-security。称为-hand的soap服务依次返回一个类对象。 我写了一个类,在调用服务的时候,我得到了以下异常。我试图将SOAP Envelop发送到服务&使用SOAP UI工具执行它&获得成功的回应。 我有点困惑,因为当我用我的JAVA SOAP客户端发送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)
      在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)

{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)
      在org.apache.axis.client.Call.invokeEngine(Call.java:2784)
      在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)

2 个答案:

答案 0 :(得分:0)

您可能已经检查了以下链接,特别是在Axis的上下文中讨论了mustUnderstand错误 http://wso2.org/library/tutorials/understand-famous-did-not-understand-mustunderstand-header-s-error

您是否已从代码中确认了整个SOAP信封,而SOAP使用的信封是否相同?在两种情况下,mustUnderstand都设置为1吗?

答案 1 :(得分:0)

我遇到了这个问题,我在工作中解决了这个问题...... 当server.xsdd

上没有安全处理程序时,会设置此类消息

在我的例子中,xsdd实现是在轴1.4上构建的,使用java.rmi和javax.xml.rpc.Service

如果是这种情况,您将有2个xsdd用于服务器(ns声明服务)和deploy.xsdd用于其他呼叫设置。

首先我添加到我的ns:操作这引用了oasis安全性,之后我向我的服务添加了请求流

它应该是这样的

<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中,您必须/或不验证用户和密码 处理程序应该是这样的

  

公共类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");
          }
        }
      }

}

希望这对你有所帮助 问候