【问题标题】:Weblogic kills CXF's SSL configuration?Weblogic 杀死 CXF 的 SSL 配置?
【发布时间】:2013-07-09 14:38:14
【问题描述】:

好时光!

我创建了一个简单的 CXF 客户端来与受 SSL 保护的远程服务进行通信。如果我运行 JUnit 测试,握手执行没有错误并且通信正常。

<http:conduit name="<service_namespace_port>.http-conduit">
   <http:client AutoRedirect="true" Connection="Keep-Alive"/>
   <http:tlsClientParameters secureSocketProtocol="SSL" disableCNCheck="true">
    <sec:keyManagers keyPassword="pass">
        <sec:keyStore type="JKS" password="pass" file="keystore"/>
    </sec:keyManagers>
    <sec:trustManagers>
        <sec:keyStore type="JKS" password="pass" file="truststore"/>
    </sec:trustManagers>
    <sec:cipherSuitesFilter>
        <sec:include>.*_EXPORT_.*</sec:include>
        <sec:include>.*_EXPORT1024_.*</sec:include>
        <sec:include>.*_WITH_DES_.*</sec:include>
        <sec:include>.*_WITH_AES_.*</sec:include>
        <sec:include>.*_WITH_NULL_.*</sec:include>
        <sec:exclude>.*_DH_anon_.*</sec:exclude>
    </sec:cipherSuitesFilter>
</http:tlsClientParameters>

如果我在 Weblogic Server (11g) 上部署我的应用程序并执行请求,则握手失败并显示错误“无法找到到所请求目标的有效证书路径”。根据“-Djavax.net.debug=all”得到的日志,问题是Weblogic得到它的java cacert (/jre/lib/security) 忽略了配置的CXF客户端的信任库。

我试图在 weblogic-application.xml 中写一行&lt;package-name&gt;javax.jws.*&lt;/package-name&gt;,但这会杀死应用程序,并出现错误“org.springframework.beans.MethodInvocationException: Property 'serviceClass' throw exception; nested exception is java .lang.NoClassDefFoundError: javax/jws/WebService"。

有人可以建议如何告诉weblogic不要参与客户端-服务器通信吗?

编辑。这是完整的客户端配置(Spring-CXF):

<http:conduit name="<service_namespace_port>.http-conduit">
        <http:client AutoRedirect="true" Connection="Keep-Alive"/>
        <http:tlsClientParameters secureSocketProtocol="SSL" disableCNCheck="true">
            <sec:keyManagers keyPassword="pass">
                <sec:keyStore type="JKS" password="pass" file="keystore"/>
            </sec:keyManagers>
            <sec:trustManagers>
                <sec:keyStore type="JKS" password="pass" file="truststore"/>
            </sec:trustManagers>
            <sec:cipherSuitesFilter>
                <sec:include>.*_EXPORT_.*</sec:include>
                <sec:include>.*_EXPORT1024_.*</sec:include>
                <sec:include>.*_WITH_DES_.*</sec:include>
                <sec:include>.*_WITH_AES_.*</sec:include>
                <sec:include>.*_WITH_NULL_.*</sec:include>
                <sec:exclude>.*_DH_anon_.*</sec:exclude>
            </sec:cipherSuitesFilter>
        </http:tlsClientParameters>
    </http:conduit>

    <jaxws:client id="service"
                  serviceClass="foo.bar.ServiceClass"
                  address="<service_url>" />
    <bean id="client" class="foo.bar.ClientClass"/>

编辑。根据this post,我改变了 &lt;http:conduit name="&lt;service_namespace_port&gt;.http-conduit"&gt;&lt;http:conduit name="*.http-conduit"&gt; 现在我收到错误“嵌套异常是 java.lang.RuntimeException:无法创建安全的 XMLInputFactory”。前段时间我遇到了这个错误,我找到的解决方案是using the system property。但是已经不适合了…… 有谁知道,如何解决这个问题?

【问题讨论】:

  • 您是否在 Apache CXF 网站上检查了 weblogic 的特定服务器配置? cxf.apache.org/docs/…
  • 是的,正如我在问题中所写,此配置会终止部署。请参阅带有“javax.jws.*”行的段落。你知道如何解决这个问题吗?
  • 既然您告诉 Weblogic 在您的 EAR/WAR 中更喜欢 javax.jws.*packages,那么您的应用程序中是否包含 JAX-WS 库?
  • 似乎没有这样的库,只要它失败了。但是如果没有这样的库,CXF 就不会使用它们。如果是这样,它将包含它们作为依赖项,Maven 会为它下载它们并且部署不会失败。如果我弄错了,请纠正我。
  • 我已经发布了关于我的发现的答案,请告诉我它是怎么回事,如果你需要其他东西,我可以帮助你。

标签: java cxf weblogic11g


【解决方案1】:

最后,我找到了解决这两个问题的方法。

首先,我要感谢 Cristian Meneses 提供的非常有用的答案!

接下来,请参阅我在this post 中对“无法创建安全的 XMLInputFactory”问题解决方案的回答。之后,检查this posthttp:conduit name 配置(在我的例子中,我使用了这样的结构:&lt;http:conduit name="*.http-conduit"&gt;)。混合这些信息,我设法使我的应用程序工作。

因此,据我了解,主要思想是当 WLS 匹配管道名称时,它使用配置的 CXF 客户端密钥库,但如果不匹配,它使用 cacerts。

HINT FOR WONDERS:实际上没有必要(但强烈建议)像官方文档中所说的那样命名 http:conduit bean(我的目标是使服务端点可配置)。 http:conduit bean 的名称是匹配服务的模板 您要连接的名称。请参考ticket。 Jason Pell 提供了一个很好的解决方法。

【讨论】:

    【解决方案2】:

    您似乎缺少一个依赖项.. geronimo-ws-metadata_2.0*(不知道您的 CXF 版本是哪个特定版本)。

    同样在 Maven Central 上,这种依赖似乎只适用于 cxf-buldle,也许这就是为什么 Maven 没有为你包含它...

    顺便说一句,如果您继续使用&lt;package-name&gt;javax.jws.*&lt;/package-name&gt;,这适用,因为geronimo-ws-metadata_2.0* 包含缺少的接口

    ===================================

    这是让管道正常工作的配置

    <!-- OVERRIDE DEFAULT TRUSTSTORE, USE BUNDLE TRUSTSTORE INSTEAD -->
    <http:conduit name="{http://myWebserviceNamespace/}myWebservicePort.http-conduit">
        <http:tlsClientParameters>
            <sec:trustManagers>
                <sec:keyStore type="JKS" password="myPass"
                     resource="myTrustStore.jks" />
                 </sec:trustManagers>
         </http:tlsClientParameters>
    </http:conduit>     
    
    <jaxws:client id="myClient"
           serviceClass="com.example.webservice.MyService"
           address="https://path.to/MYSERVICE/services/MyWebservice"/>
    

    我不得不使用“资源”而不是“文件”,因为我的信任库位于类路径中

    【讨论】:

    • 抱歉,部署过程需要一些时间。此解决方案修复了 spring 配置(“javax.jws.*”问题),但没有解决主要问题。 Weblogic 和以前一样使用 jdk1.6.0_45\jre\lib\security\cacerts。
    • 您能否发布定义您的 web 服务客户端的 spring 上下文?几天前我在 Websphere App Server 上遇到了这个问题,也许我可以帮你解决这个问题。“主要问题”是指它继续使用 jre/lib/sercurity/cacerts 信任库?
    • 当然。请看编辑。主要问题是Weblogic杀死了CXF的配置
    • 我看到的最后一个解决方案是将我的信任库设置为 Weblogic,但这似乎是个坏主意,因为之后我看不到配置 CXF 的理由
    • 我已经添加了我的示例配置来回答......也许它可以帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2012-11-07
    • 1970-01-01
    • 2017-01-17
    • 2011-03-12
    相关资源
    最近更新 更多