美好时光!
我创建了一个简单的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忽略了已配置的CXF客户端的信任库而获取了其Java cacert(/ jre / lib / security).
我试图写一行< package-name> javax.jws.*< / package-name>在weblogic-application.xml中,但这会杀死应用程序,并显示错误“ org.springframework.beans.MethodInvocationException:属性’serviceClass’引发异常;嵌套的异常是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,我已经更改了
< http:conduit name =“< service_namespace_port> .http-conduit”>到< http:conduit name =“ *.http-conduit”>
现在出现错误“嵌套的异常是java.lang.RuntimeException:无法创建安全的XMLInputFactory”.不久前,我遇到了这个错误,找到的解决方案是using the system property.但是它不再适合…
有人知道,该如何解决?
解决方法:
最后,我为两个问题都提供了解决方案.
首先,我要感谢Cristian Meneses的有用帮助!
接下来,请参见我在this post中针对“无法创建安全的XMLInputFactory”问题解决方案的回答.然后,检查this post的http:conduit名称配置(在我的情况下,我使用了这样的构造:< http:conduit name =“ *.http-conduit”>).混合这些信息,我设法使我的应用程序正常工作.
因此,据我了解,主要思想是WLS与管道的名称匹配时,它将使用配置的CXF的客户端密钥库,但如果不匹配,则使用cacerts.
提示:确实没有必要(但强烈建议)像官方文档中所说的那样命名http:conduit bean(我的目的是使服务端点可配置). http:conduit bean的名称是用于匹配服务的模板
您要连接的名称.请参阅ticket.Jason Pell提供了一个很好的解决方法.