首页 文章

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

提问于
浏览 1338
1

请帮我解决这个问题 .

我正在编写一个java SOAP客户端来点击正在使用HTPPS的某个第三方的SOAP服务并接受标头中的web安全性 . 称为-hand的soap服务依次返回一个类对象 . 我写了一个类,在调用服务的时候,我得到的是异常 . 我试图获得发送到服务的SOAP Envelop并使用SOAP UI工具执行它并获得成功的响应 . 我有点困惑,因为当我用我的JAVA SOAP客户端发送SOAP信封时我得到以下异常,同时使用SOAP UI工具运行相同的SOAP信封,我得到了成功的响应 .

线程“main”中的异常AxisFault faultCode:{http://schemas.xmlsoap.org/soap/envelope/}MustUnderstand faultSubcode:faultString:不明白“MustUnderstand” Headers :faultActor:faultNode:faultDetail:{http ://xml.apache.org/axis/} stackTrace:at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96)at org.apache.axis.client.AxisClient.invoke(AxisClient . :org.apache.axis.cl .Call.invoke(Call.java:1910)at fibonacci.testing.TestService.main(TestService.java:92)

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

在org.apache.axis.client.AxisClient.invoke(AxisClient.java:org.apache.axis.client.AxisClient.invoke)中无法理解“MustUnderstand” Headers :org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:96): 206)org.apache.axis.client.Call.invokeEngine(Call.java:2784)atg.apache.axis.client.Call.invoke(Call.java:2767)org.apache.axis.client.Call .invoke(Call.java:1910)at fibonacci.testing.TestService.main(TestService.java:92)

2 回答

  • 0

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

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

  • 0

    我遇到了这个问题,我已经在我的工作中解决了这个问题...当你没有安全处理程序时,就会设置这种类型的消息.xdddd

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

    public class 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");
              }
            }
          }
    

    }

    希望这有助于你问候

相关问题