Сначала я начну с резюме.Я использую клиент Apache CXF для связи по SSL с поставщиком услуг Apache CXF, который использует самозаверяющий сертификат.Я импортировал сертификат в хранилище доверенных сертификатов WebSphere на клиентском сервере, но по-прежнему получаю «javax.net.ssl.SSLHandshakeException: SSLHandshakeException, вызывающее https://somesvcprovider.com/appname/svc/myservice: com.ibm.jsse2.util.h: доверенный сертификат не найден»исключение.
Теперь вот подробности:
У меня есть клиент веб-службы Apache CXF, который я настраиваю с помощью Spring, и клиент развернут на сервере приложений WebSphere 6.1.Клиент CXF связывается с поставщиком услуг Apache CXF на другом сервере WebSphere.Для связи используется 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.Код для связи со службой приведен ниже:
List<String> formNames = client.retrieveNames(formIdsList);
Кроме того, я не знаю, связано ли это с этим, но при проверке объекта TLSClientParameters на клиенте CXF во время выполнения никакие диспетчеры доверия не возвращаются.Код для проверки приведен ниже:
// 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 доверял самозаверяющему сертификату?
Я предпочитаюне нужно указывать путь к хранилищу доверенных сертификатов вместе с паролем в файле конфигурации.
Спасибо!