【问题标题】:CXF web service client: "Cannot create a secure XMLInputFactory"CXF Web 服务客户端:“无法创建安全的 XMLInputFactory”
【发布时间】:2013-12-05 13:37:07
【问题描述】:

我使用指令here 编写并部署了 CXF Web 服务到 Tomcat 服务器中。 Web 服务部署良好,因为我可以在 Web 浏览器中看到 WSDL 文件。

但我的独立 Java 客户端程序不起作用。代码如下:

System.out.println("Creating client");
Properties properties = System.getProperties();
properties.put("org.apache.cxf.stax.allowInsecureParser", "1");
System.setProperties(properties);
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(ExampleWebService.class);
factory.setAddress("http://X.X.X.X:9090/WebServices/ExampleWebService");
ExampleWebService exampleWebService = (ExampleWebService)factory.create();
System.out.println("Done creating client");
exampleWebService.method1("test");
System.out.println("After calling method1");

我将 CXF 2.7.7 发行版中的所有 jar 文件(包括 woodstox-core-asl-4.2.0.jar 文件)复制到客户端程序的类路径中,当我运行客户端时出现以下异常:

Creating client
Nov 20, 2013 8:05:26 PM org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
INFO: Creating Service {http://webservices.server/}ExampleWebServiceService from class server.webservices.ExampleWebService
Done creating client
javax.xml.ws.soap.SOAPFaultException: Cannot create a secure XMLInputFactory
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:157)
    at $Proxy38.printString(Unknown Source)
    at ExampleNmsWebServiceClient.printString(ExampleNmsWebServiceClient.java:29)
    at ExampleNmsWebServiceClient.main(ExampleNmsWebServiceClient.java:40)
Caused by: org.apache.cxf.binding.soap.SoapFault: Cannot create a secure XMLInputFactory
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:84)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:51)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:40)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:113)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:835)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1606)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1502)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1309)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:627)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:565)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:474)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:377)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:330)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:135)
    ... 3 more

我发现一个页面说“无法创建安全的 XMLInputFactory”可以通过将 org.apache.cxf.stax.allowInsecureParser 属性设置为“1”来修复,这就是我尝试在系统属性中设置它的原因,但这没有用。我还尝试将 -Dorg.apache.cxf.stax.allowInsecureParser=1 添加到运行客户端的 java 命令中,但这也不起作用。 (也没有将其设置为“true”而不是 1。)关于如何解决此错误的任何想法?

【问题讨论】:

    标签: web-services cxf woodstox


    【解决方案1】:

    检查可在类路径或 jre 的 lib/endorsed 或类似文件中找到的任何其他版本的 woodstox。听起来可能会选择旧的 4.1 版本。

    【讨论】:

    • 我在客户的类路径中只提到了一个 woodstox-core-asl-4.2.0.jar,我在 JRE 的 lib 目录中找不到任何 woodstox*。
    【解决方案2】:

    问题是服务器上的 Web 服务部署中缺少一些 CXF jar 文件。这很难调试,因为服务器上没有错误。

    【讨论】:

    • 您知道丢失了哪些 CXF 文件吗?我自己也有类似的问题。
    • 想通了;我通过取消排除 org.apache.cxf:cxf-bundle-jaxrs 解决了我的问题。
    • 丢失了哪些文件?
    【解决方案3】:

    我遇到了这个问题,这是因为当我从旧版本的 cxf 升级时,我没有在客户端类路径中将 stax-api-*.jar 更改为 stax2-api-*.jar。

    【讨论】:

      【解决方案4】:

      我在 weblogic 上遇到了这个问题,并通过将其添加到我的 weblogic-application.xml 来解决问题

      <prefer-application-packages>
             <package-name>com.ctc.wstx.*</package-name>
      </prefer-application-packages>
      

      【讨论】:

      • 如何在 jboss 中实现与 7.1.1.Final 相同的效果...任何想法?
      • 附注:com.ctc.wstx.* 包被 cxf-api 拉取的woodstox-core-asl 使用。
      【解决方案5】:

      从 CXF 2.3.x 升级到 2.7.x 时遇到这个问题

      添加了来自 2.7.x CXF 发行版的 stax2-apiwoodstox-core-asl jar,网络服务再次运行。

      【讨论】:

      • 5 年后的 2019 年,我在 CXF 3.3.3 中遇到了这个问题。除了添加这两个依赖项之外,我还需要从包含旧版本的其他依赖项中排除其他 stax-api 和 woodstox 和 wstx 库。 maven 目标 dependency:tree 帮助我解决了这个问题。
      【解决方案6】:

      就我而言,有两个罐子(Cxf 3.0.1,Jboss 7.1.1)

      javax.xml.stream:stax-api:jar:1.0-2:compile

      org.codehaus.woodstox:stax2-api:jar:3.1.4:compile

      我删除了第一个并开始工作

      【讨论】:

        【解决方案7】:

        我也遇到过类似的问题

        将此-Dorg.apache.cxf.stax.allowInsecureParser=1 添加到setDomainEnv.sh 中的JAVA_OPTIONS 后,现在可以正常工作了。

        【讨论】:

        • 我也采用了这个解决方案。就我而言,问题是当 StaxUtils 尝试获取新的 XMLInputFactory (XMLInputFactory.newInstance();) 时,它从我的 webservices-rt-2.3.jar 中获取了 WstxInputFactory,而不是从 woodstox-core-asl-4.4.1 获取了安全版本。罐。不幸的是,我需要 webservices-rt 来处理其他代码,所以不得不求助于这个解决方案。当涉及到依赖冲突时,Apache CXF 可能会让人头疼。
        【解决方案8】:

        如果您升级到 3.0.0 或更高版本,您不应添加 woodstock 依赖项

        【讨论】:

        • 这似乎不是真的,你从哪里得到这个信息?在 WoodstoxHelper (3.1.11) 类中,他们称之为 Woodstox
        【解决方案9】:

        从 2.7.4 版本开始,CXF 添加了一项功能,以确保 XMLInputFactory 受到保护并从woodstox(>= 4.2.x 包,请参阅StaxUtil implementation)加载,以处理Denial of Service vulnerability

        但事实是,在 J2EE 环境中,默认情况下,webservices-rt.jar 优先于战争库(然后是woodstock jar)。这就是加载非安全实现并触发异常的原因。

        关闭 org.apache.cxf.stax.allowInsecureParser 属性,不是一种选择,因为它会带回 DOS 漏洞。

        为了使类加载器更喜欢woodstox(ear/war lib)而不是webservices-rt.jar(j2ee lib),解决方案取决于您的应用程序服务器,并在CXF application server specific configuration guide中进行了描述

        【讨论】:

        • +1 以获得最完整的解释,但 allowInsecureParser 对我来说很好,因为我只需要它来进行本地调试。
        • Tomcat 是否需要此类加载器排序?
        • 我从来不需要使用 CXF 在 tomcat 7 oder 8.5 上订购类加载器。
        【解决方案10】:

        从我的角度来看,我必须同时删除 stax-api-1.0-2.jar(留下 stax2-api-3.1.4.jar 和 woodstock 4.4 jar)并在 weblogic-application.xml 中指定结束:

             .
             .
             <package-name>com.ctc.wstx.*</package-name>  
             <package-name>org.codehaus.stax2.*</package-name>
         </prefer-application-packages>
        

        【讨论】:

          【解决方案11】:

          我在 weblogic 上遇到了这个问题,应用程序部署成功,但是当我触发了肥皂请求时,我遇到了这个错误:无法创建安全的 XMLInputFactory。

          通过将此包添加到 weblogic-application.xml 来解决问题

          com.ctc.wstx.*

          【讨论】:

            【解决方案12】:

            我查看了我的依赖项,发现与 woodstox 或 stax-api 的版本冲突。

            原来是axis2-transport-http 引入了这些冲突。

            如果你碰巧也有这个依赖项,请将以下排除项添加到引入它的 pom 依赖项中

            <exclusions>
                        <exclusion>
                            <groupId>org.apache.axis2</groupId>
                            <artifactId>axis2-transport-http</artifactId>
                        </exclusion>
                    </exclusions>
            

            【讨论】:

              【解决方案13】:

              这里没有描述我的问题的此错误消息的根本原因的答案。我们对两个新版本都有传递依赖 woodstox-core-asl-4.2.0.jar 和老 wstx-asl-3.2.1.jar

              从我们的构建中排除旧版本就可以了。

              如果您深入了解旧版本的内容,您会发现它失败并出现异常,最终被包含在另一个异常中,此通用消息信息量不大。

              【讨论】:

              • 好答案!我只在我们的生产系统上发现了这个错误,并且无法在本地重现它。阅读您的评论后,我能够重现并修复它。拯救了我的一天!
              • 同样的战争在我的本地 Windows 机器 TC Server tomcat 8 中运行良好,但是当部署到 UNIX 机器时它失败了。删除旧版本的 wstx-asl.***.jars 解决了问题
              • 我们使用 Apache CXF 3.1.10 在 JBoss 6.4 上运行的应用程序中调用 Web 服务。在我的本地 Windows 机器上,服务调用运行良好。但是,在我们的 QA 环境中,我们看到了“无法创建安全的 XMLInputFactory”错误。 WAR 文件在 WEB-INF/lib 文件夹中具有 woodstock-core-asl-4.2.0.jar 和 wstx-asl-3.2.9.jar 作为依赖项。我删除了 wstx-asl-3.2.9.jar 文件,Web 服务调用按预期工作。非常感谢您的回答。
              【解决方案14】:

              我可以通过在我的应用程序的 WEB-INF 文件夹中添加 weblogic.xml 来解决这个问题,代码如下:

              <prefer-web-inf-classes>false</prefer-web-inf-classes>
              
              <prefer-application-packages>
                  <package-name>com.ctc.*</package-name>
              </prefer-application-packages>
              

              【讨论】:

                【解决方案15】:

                当我将 CXF 升级到 2.7.x 时,我遇到了同样的问题。我通过在 POM 中添加以下依赖项解决了这个问题

                <dependency>
                    <groupId>org.codehaus.woodstox</groupId>
                    <artifactId>stax2-api</artifactId>
                    <version>4.0.0</version>
                </dependency>
                <dependency>
                    <groupId>org.codehaus.woodstox</groupId>
                    <artifactId>woodstox-core-asl</artifactId>
                    <version>4.4.1</version>
                </dependency>
                

                【讨论】:

                  【解决方案16】:

                  1: -Dorg.apache.cxf.stax.allowInsecureParser=1 到 JAVA_OPTIONS

                  2:重命名woodstox-core-asl-4.4.1.jar -> awoodstox-core-asl-4.4.1.jar

                  【讨论】:

                  • 嗨,请考虑编辑您的答案以添加更多解释,这可以帮助 OP 以及将来遇到类似问题的任何人
                  【解决方案17】:

                  有趣的是,我在 docker 容器中遇到了这个问题,而不是在 tomcat 服务器上运行它时。

                  我面临的问题是该项目有另一个较低版本的 wstx-asl-3.2.7,并且类加载器可能首先加载了这个版本。 我摆脱了它,并考虑了必要的woodstox并解决了问题。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-12-24
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-09-18
                    • 2011-03-21
                    相关资源
                    最近更新 更多