如何设置Apache CXF客户端以使用WebSphere truststore?(收到"找不到可信证书"例外.)

Tob*_*san 10 ssl websphere cxf websphere-6.1

首先,我将从摘要开始.我正在使用Apache CXF客户端通过SSL与使用自签名证书的Apache CXF服务提供商进行通信.我将证书导入到客户端服务器的WebSphere信任,但我仍然收到"javax.net.ssl.SSLHandshakeException:出现SSLHandshakeException调用https://somesvcprovider.com/appname/svc/myservice:com.ibm.jsse2.util .h:找不到可信证书"例外.

现在,这是详细信息:

我有一个Apache CXF Web服务客户端,我使用Spring进行配置,客户端部署到WebSphere 6.1应用程序服务器.CXF客户端与不同WebSphere服务器上的Apache CXF服务提供程序进行通信.通信使用SSL.

服务提供商使用自签名证书.我已经通过管理控制台将提供者的证书导入客户端服务器上的WebSphere信任库.我通过SSL证书和密钥管理> SSL配置> NodeDefaultSSLSettings>密钥库和证书> NodeDefaultTrustStore>签署者证书完成了这项工作; 然后我使用"从端口检索"工具导入证书.

但是,在尝试联系服务提供者时仍然收到此错误:"javax.net.ssl.SSLHandshakeException:SSLHandshakeException调用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>
Run Code Online (Sandbox Code Playgroud)

如上所示,CXF客户端由Spring通过setter注入.联系该服务的代码如下:

List<String> formNames = client.retrieveNames(formIdsList);
Run Code Online (Sandbox Code Playgroud)

此外,我不知道这是否相关,但在运行时检查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
Run Code Online (Sandbox Code Playgroud)

为了让Apache CXF客户端信任自签名证书,我还需要做些什么吗?

我更喜欢不必在配置文件中指定信任库的路径和密码.

谢谢!

Kje*_*ard 8

CXF可能使用了错误的SSL套接字工厂.

尝试将此添加到您的Spring配置:

<http-conf:conduit name="*.http-conduit">
    <http-conf:tlsClientParameters useHttpsURLConnectionDefaultSslSocketFactory="true"/>
</http-conf:conduit>
Run Code Online (Sandbox Code Playgroud)


use*_*176 1

我认为您不能像使用外部组件(Apache CXF)一样使用 WAS 密钥库。您可能必须构建并使用自己的 TrustManager。似乎有几个可行的例子