美好时光!
我创建了一个简单的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。但它不再适合......
有谁知道,如何解决这个问题?
答案 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”,因为我的信任库位于类路径