时间很好!
我创建了一个简单的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 (11g)上并执行请求,则握手失败,出现“无法找到指向请求目标的有效证书路径”的错误。根据"-Djavax.net.debug=all“获得的日志,问题是Weblogic忽略了已配置的CXF客户端的信任库,从而使其java仙人掌(/jre/lib/security)忽略。
我尝试在weblogic-application.xml中编写一行"org.springframework.beans.MethodInvocationException:,但是这会导致错误的<package-name>javax.jws.*</package-name>属性'serviceClass‘抛出异常;嵌套的异常是java.lang.NoClassDefFoundError: javax/jws/WebService“。
请有人建议,如何告诉weblogic不要参与到服务器端的通信中来?
编辑。这是完整的客户端配置(Spring):
<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”的错误。不久前,我遇到了这个错误,我找到的解决方案是使用系统属性。但已经不适合了..。有人知道怎么解决这个问题吗?
发布于 2013-07-10 08:10:19
最后,我给出了两个问题的解决方案。
首先,我要感谢克里斯蒂安·梅内塞给出的非常有帮助的答案!
接下来,请参阅我在这个职位中的答案,以获得“无法创建安全XMLInputFactory”问题解决方案。在此之后,请查看这个职位的http:conduit 名称配置(在我的例子中,我使用了这样的构造:<http:conduit name="*.http-conduit">)。在这些信息中,我设法使我的应用程序正常工作。
因此,据我所知,的主要思想是,当WLS匹配管道名称时,它使用已配置的CXF客户端密钥存储库,但如果不匹配,则使用仙人掌。
提示提示奇迹:没有必要(但强烈建议)像它在正式文档中所说的那样命名http:导管bean (我的目标是使服务端点可配置)。http:导管bean的名称是一个模板,用于匹配要连接到的服务名称。请参考票证。贾森·佩尔提供了一个很好的解决办法。
发布于 2013-07-09 15:04:28
你似乎失去了依赖..。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"/>我不得不使用“资源”而不是“文件”,因为我的信任库位于类路径上。
https://stackoverflow.com/questions/17551097
复制相似问题