3

美好时光!

我创建了一个简单的 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客户端的信任库。

我试图<package-name>javax.jws.*</package-name>在 weblogic-application.xml 中写一行,但这会以错误“org.springframework.beans.MethodInvocationException: Property 'serviceClass' throw exception; 嵌套异常是 java.lang.NoClassDefFoundError: javax /jws/Web 服务”。

有人可以建议如何告诉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"/>

编辑。根据这篇文章,我已更改 <http:conduit name="<service_namespace_port>.http-conduit"><http:conduit name="*.http-conduit"> ,现在我收到错误“嵌套异常是 java.lang.RuntimeException:无法创建安全的 XMLInputFactory”。前段时间我遇到了这个错误,我找到的解决方案是使用系统属性。但它不再适合......有人知道如何解决这个问题吗?

4

2 回答 2

3

最后,我对这两个问题都有解决方案。

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

接下来,请参阅我在这篇文章中对“无法创建安全的 XMLInputFactory”问题解决方案的回答。在那之后,检查这个帖子http:conduit 名称配置(在我的例子中,我使用了这样的结构:)<http:conduit name="*.http-conduit">。混合这些信息,我设法使我的应用程序工作。

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

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

于 2013-07-10T08:10:19.463 回答
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"/>

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

于 2013-07-09T15:04:28.187 回答