Мы используем Springs HttpInvoker уже несколько недель, и это работает как шарм. Из моего внешнего (веб) приложения я подключаюсь к пользовательской службе бэкэнда следующим образом:
<bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="http://${backend.host}/backend-ws/remoting/UserService"/>
<property name="serviceInterface" value="com...service.UserService"/>
</bean>
UserService затем красиво добавляется в наши классы внешнего интерфейса.
Теперь мы развертываем это на правильном (WAS7) сервере, и требуется использовать SSL (https). Итак, я изменяю http (для serviceUrl) на https, но затем получаю:
org.springframework.remoting.RemoteAccessException: Could not access HTTP invoker remote service at [https://pbp-dev.dev.echonet/public/backend-ws/remoting/ParameterHelper]; nested exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
, что имеет смысл, поскольку сертификат, установленный на сервере (где работает WAS), не подписан центром сертификации.
У нас уже есть некоторый опыт в этом, поскольку на том же WAS работает веб-сервис; для этого мы используем cxf и сгенерировали файл jks (с keytool), который находится в клиентском приложении и настроен следующим образом:
<http:conduit name="https://serverurl/.*">
<http:tlsClientParameters secureSocketProtocol="SSL" disableCNCheck="false">
<sec:trustManagers>
<sec:keyStore type="jks" password="pass123" resource="trust.jks"/>
</sec:trustManagers>
</http:tlsClientParameters>
Я думаю, для Http Invoker нам нужно сделать что-то похожее, но мы не знаем, как использовать этот trust.jks в invoker.
Одна вещь, которую я нашел, это использовать другой requestExecutor; как это:
<bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
<property name="serviceUrl" value="https://${backend.host}/backend-ws/remoting/UserService"/>
<property name="serviceInterface" value="com...service.UserService"/>
<property name="httpInvokerRequestExecutor">
<bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor" />
</property>
</bean>
После этого я больше не получаю ошибку сертификата, но пользовательская служба, кажется, не создается с тех пор, как я получаю:
NoSuchBeanDefinitionException: No matching bean of type [com...service.UserService] found for dependency