Java Apache.CXF 无法工作 WSS4JOutInterceptor

问题描述

好吧,我正在使用 Java 中的 SOAP,我正在使用 Apache.CXF 2.7.18,我正在尝试执行以下代码

package org.example.consumo_soap;

import java.lang.String;
import static java.lang.System.exit;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import com.dc.hc.ws.v1.Parametro;
import com.dc.hc.ws.v1.Parametros;
import com.dc.hc.ws.v1.HCBException;
import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyfactorybean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;
import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;


public final class App {
    private App() {}
    public static void main(String[] args)  throws Exception {
        System.setProperty("javax.net.ssl.trustStore","xxxxxxxxxxxxx.p12");
        System.setProperty("javax.net.ssl.trustStoreType","PKCS12");
        System.setProperty("javax.net.ssl.trustStorePassword","xxxxxxxxxxxx");
        System.setProperty("javax.net.ssl.keyStore","xxxxxxxxxxxxx.p12");
        System.setProperty("javax.net.ssl.keyStoreType","PKCS12");
        System.setProperty("javax.net.ssl.keyStorePassword","xxxxxxxxxxxx");

        JaxWsProxyfactorybean factory = new JaxWsProxyfactorybean();
        factory.setAddress("https://xxxxxxxxx.xxxx:443/wss/xxxx/servicex/DHService");
        factory.setServiceClass(HC.class);
        Object client = (HC) factory.create();

        LoggingOutInterceptor loggingOutInterceptor = new LoggingOutInterceptor();
        loggingOutInterceptor.setPrettyLogging(true);
        ClientProxy.getClient(client).getoutInterceptors().add(loggingOutInterceptor);

        LoggingInInterceptor loggingInInterceptor = new LoggingInInterceptor();
        loggingInInterceptor.setPrettyLogging(true);
        ClientProxy.getClient(client).getininterceptors().add(loggingInInterceptor);
//~ 
        Map<String,Object> propsOut = new HashMap<String,Object>();
        propsOut.put(WSHandlerConstants.ACTION,WSHandlerConstants.SIGNATURE + " " + WSHandlerConstants.USERNAME_TOKEN + " " + WSHandlerConstants.TIMESTAMP);
        //~ propsOut.put(WSHandlerConstants.TIMESTAMP,"60");
        propsOut.put(WSHandlerConstants.TIMESTAMP_PRECISION,"true");
        propsOut.put(WSHandlerConstants.USER,"2-24252523235");
        propsOut.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);
        propsOut.put(WSHandlerConstants.PW_CALLBACK_CLASS,PasswordClientCallBackHandler.class.getName());
        propsOut.put(WSHandlerConstants.ADD_UT_ELEMENTS,WSConstants.NONCE_LN + " " + WSConstants.CREATED_LN);
        propsOut.put
        (
            WSHandlerConstants.SIGNATURE_PARTS,"{Content}{http://schemas.xmlsoap.org/soap/envelope/}Body;{Element}{http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-secext1.0.xsd}Usernametoken;{Element}{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wsswssecurity-utility-1.0.xsd}Timestamp;"
        );
        
        WSS4JOutInterceptor wss4jOut = new WSS4JOutInterceptor(propsOut);
        ClientProxy.getClient(client).getoutInterceptors().add(wss4jOut);
 //~ 
        HTTPConduit httpConduit = (HTTPConduit) ClientProxy.getClient(client).getConduit();
        TLSClientParameters tlsCP = new TLSClientParameters();
        tlsCP.setdisableCNCheck(true);
        httpConduit.setTlsClientParameters(tlsCP);
        HC port = (HC) client;

        System.out.println("Invoking consultarHC...");
        String idsus = "24252523235";
        String clasus = "xxxxxxxxxxxxx";
        String tipoid = "20";
        String id = "437191799";
        String papellido = "Castro";
        Parametros parametros = new Parametros();
        List<Parametro> list_parametros = new ArrayList<Parametro>();
        Parametro parametro = new Parametro();
        parametro.setNombre("");
        parametro.setTipo("");
        parametro.setValor("");
        list_parametros.add(parametro);
        parametros.getParametro().addAll(list_parametros);

        try {
            String _consultarHC__return = port.consultarHC(idsus,clasus,tipoid,id,papellido,parametros);
            System.out.println("consultarHC.result=" + _consultarHC__return);
        } catch (Exception e) {
            System.out.println("Expected exception: HCBException has occurred.");
            System.out.println(e.toString());
        }//~ */
    }
}

当我执行它时捕获以下异常:

    INFORMACIÓN: Creating Service {http://www.xxxxxxxxxxx.com.co/services/xxxxxxxxxxxxxxxx/v1}HCService from class org.example.consumo_soap.HC
Invoking consultarHC...
feb 06,2021 4:03:10 PM org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
WARNING: Interceptor for {http://www.xxxxxxxxxxx.com.co/services/xxxxxxxxxxxxxxxx/v1}HCService#{http://www.xxxxxxxxxxx.com.co/services/xxxxxxxxxxxxxxxx/v1}consultarHC has thrown exception,unwinding Now
java.lang.classCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to javax.xml.soap.soAPElement
    at org.apache.cxf.binding.soap.saaj.saajStreamWriter.adjustOverlaidNode(saajStreamWriter.java:67)
    at org.apache.cxf.staxutils.OverlayW3CDOMStreamWriter.writeStartElement(OverlayW3CDOMStreamWriter.java:192)
    at org.apache.cxf.binding.soap.interceptor.soapOutInterceptor.writeSoapEnvelopestart(SoapOutInterceptor.java:128)
    at org.apache.cxf.binding.soap.interceptor.soapOutInterceptor.handleMessage(SoapOutInterceptor.java:87)
    at org.apache.cxf.binding.soap.interceptor.soapOutInterceptor.handleMessage(SoapOutInterceptor.java:67)
    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)
    at com.sun.proxy.$Proxy37.consultarHC(UnkNown Source)
    at org.example.consumo_soap.App.main(App.java:86)

Expected exception: HCBException has occurred.
javax.xml.ws.soap.soAPFaultException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to javax.xml.soap.soAPElement
------------------------------------------------------------------------

在 SOAPUI 中,服务消费的头部是:

    <soapenv:Header>
      <wsse:Security
         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">
         <wsse:BinarySecurityToken
         EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
         ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
         wsu:Id="X509-6C3E0EA6E1661184DD161107016391093">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</wsse:BinarySecurityToken>
         <ds:Signature Id="SIG-6C3E0EA6E1661184DD161107016395097" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
               <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                  <ec:InclusiveNamespaces PrefixList="soapenv v1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
               </ds:CanonicalizationMethod>
               <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
               <ds:Reference URI="#id-6C3E0EA6E1661184DD161107016391096">
                  <ds:Transforms>
                     <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <ec:InclusiveNamespaces PrefixList="v1" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                     </ds:Transform>
                  </ds:Transforms>
                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                  <ds:DigestValue>eEAzUQyBWzJRy90Av4FBEx0ov2Y=</ds:DigestValue>
               </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>SpixsGA2i0iJXF4xexEUo1wviFxxLVoaLMb+nzKYwSDClS8zLBNc9BDn0UrvbsW6rm21frGRozRm&#13;
iNoioWyQND0xmt7inc8BpLSr7+feds2NDLjotbtWsl43cIdIidoXFWfQApgKCKSwOt+deZPcOwCP&#13;
Bx5sJSahpzOKyVouvYUVUOVOUVuogusAkNIX+xzl2gOQ83rjyox65nOy0yOKdF5D7i0p+4/CoYUe&#13;
yuS63nR7maGjHVUVOUvUWd4B0t8oWL8QaKGNjFQrwgOVOUdxlJqH/xkD05La3Cy17gHyL5JlHzyE&#13;
xIH+JODU8nfkDFe/WBnbKzItvpYUcp8tlviKd==</ds:SignatureValue>
            <ds:KeyInfo Id="KI-6C3E0EA6E1661184DD161107016391094">
               <wsse:SecurityTokenReference wsu:Id="STR-6C3E0EA6E1661184DD161107016391095">
                  <wsse:Reference URI="#X509-6C3E0EA6E1661184DD161107016391093" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
               </wsse:SecurityTokenReference>
            </ds:KeyInfo>
         </ds:Signature>
         <wsse:Usernametoken wsu:Id="Usernametoken-6C3E0EA6E1661184DD161107016390892">
            <wsse:Username>2-24252523235</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">xxxxxxxxxxxxx</wsse:Password>
            <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">mAXRJ1JEgxUIkXzx745teQ==</wsse:Nonce>
            <wsu:Created>2021-01-19T15:29:23.908Z</wsu:Created>
         </wsse:Usernametoken>
         <wsu:Timestamp wsu:Id="TS-6C3E0EA6E1661184DD161107016390891">
            <wsu:Created>2021-01-19T15:29:23.908Z</wsu:Created>
            <wsu:Expires>2021-01-19T15:30:23.908Z</wsu:Expires>
         </wsu:Timestamp>
      </wsse:Security>
   </soapenv:Header>

然后,我不知道错误以及为什么它会在 java 中响应该错误。我认为它必须从服务器响应错误 403。而且我没有找到使用 WSS4J 编码标头的正确方法

提前致谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)