首先,我将从一个总结开始。我正在使用 Apache CXF 客户端通过 SSL 与使用自签名证书的 Apache CXF 服务提供商进行通信。我将证书导入客户端服务器上的 WebSphere 信任库,但我仍然收到“javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://somesvcprovider.com/appname/svc/myservice : com.ibm.jsse2.util .h:未找到受信任的证书”异常。
现在,这是详细信息:
我有一个使用 Spring 配置的 Apache CXF Web 服务客户端,该客户端部署到 WebSphere 6.1 应用程序服务器。CXF 客户端与不同 WebSphere 服务器上的 Apache CXF 服务提供者通信。通信使用 SSL。
服务提供商正在使用自签名证书。我已经通过管理控制台将提供者的证书导入到客户端服务器上的 WebSphere 信任库中。我通过转到 SSL 证书和密钥管理 > SSL 配置 > NodeDefaultSSLSettings > 密钥库和证书 > NodeDefaultTrustStore > 签名者证书来完成此操作;然后我使用“从端口检索”工具导入证书。
但是,在尝试联系服务提供商时,我仍然收到此错误:“javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://somesvcprovider.com/appname/svc/myservice : com.ibm.jsse2.util.h:未找到受信任的证书”。
Spring配置文件如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://cxf.apache.org/configuration/security"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://cxf.apache.org/configuration/security
http://cxf.apache.org/schemas/configuration/security.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<http:conduit name="*.http-conduit">
<!-- deactivate HTTPS url hostname verification (localhost, etc) -->
<!-- WARNING ! disableCNcheck=true should not used in production. -->
<http:tlsClientParameters disableCNCheck="true" />
</http:conduit>
<!-- Read properties from property file(s). -->
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- The *.spring.properties files are prefixed with a system property
that is set on the WebSphere server. -->
<value>classpath:spring.${my.env}.properties</value>
</list>
</property>
</bean>
<jaxws:client id="myServiceClient"
serviceClass="com.client.stub.cxf.IMyService"
address="${my.svc.url}" />
<bean id="myReport" class="com.client.MyReportRequestor">
<property name="client" ref="myServiceClient"/>
</bean>
</beans>
如上所示,CXF 客户端是由 Spring 通过 setter 注入的。联系服务的代码如下:
List<String> formNames = client.retrieveNames(formIdsList);
另外,我不知道这是否相关,但是当我在运行时检查 CXF 客户端上的 TLSClientParameters 对象时,没有返回信任管理器。进行检查的代码如下:
// Get the trust managers for this client.
Client proxy = ClientProxy.getClient(client);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
TLSClientParameters tls = conduit.getTlsClientParameters();
TrustManager[] trustManagers = tls.getTrustManagers(); // trustManagers is null
为了让 Apache CXF 客户端信任自签名证书,我还需要做些什么吗?
我宁愿不必在配置文件中指定信任库的路径以及密码。
谢谢!