Weblogic杀死了CXF的SSL配置?

时间:2013-07-09 14:38:15

标签: java cxf weblogic11g

美好时光!

我创建了一个简单的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中编写一行<package-name>javax.jws.*</package-name>,但这会导致应用程序错误“org.springframework.beans.MethodInvocationException:Property'serviceClass'抛出异常;嵌套异常是java.lang.NoClassDefFoundError:javax / jws / WebService“。

有人可以建议,如何告诉weblogic不要参与clent-server通信?

修改即可。这是完整的客户端配置(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"/>

修改即可。根据{{​​3}},我改变了。{ <http:conduit name="<service_namespace_port>.http-conduit"><http:conduit name="*.http-conduit"> 现在我收到错误“嵌套异常是java.lang.RuntimeException:无法创建安全的XMLInputFactory”。前段时间我遇到了这个错误,我找到的解决方案是this post。但它不再适合...... 有谁知道,如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

首先,我要感谢Cristian Meneses真正有用的答案!

接下来,请在this post中查看我的回答“无法创建安全的XMLInputFactory”问题解决方案。然后,检查this post以查看http:conduit 名称配置(在我的情况下,我使用了这样的构造:<http:conduit name="*.http-conduit">)。混合我已设法使我的应用程序工作的信息。

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

给WONDERS提示:并不是真的有必要(但强烈建议)按照官方文档中的说法命名http:conduit bean(我的目的是使服务端点可配置)。 http:conduit bean的名称是用于匹配服务的模板 要连接的名称。请参考ticket。 Jason Pell提供了一个很好的解决方法。

答案 1 :(得分:0)

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

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

顺便说一句,如果您继续使用<package-name>javax.jws.*</package-name>,这适用,因为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"/>

我必须使用“resource”而不是“file”,因为我的信任库位于类路径