编程语言
首页 > 编程语言> > 具有HTTP和未签名证书的Spring HTTP调用程序

具有HTTP和未签名证书的Spring HTTP调用程序

作者:互联网

我们已经使用Springs HttpInvoker几周了,它的工作原理就像是一种魅力.从前端(Web)应用程序,我像这样连接到后端的userService:

<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).因此,我将(serviceUrl的)http更改为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的服务器)上的证书不是由CA签名的.

我们已经有了一些经验,因为在同一WAS上正在运行Web服务.为此,我们使用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.

我发现的一件事是使用了不同的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>

在此之后,我不再收到证书错误,但是从那以后似乎没有创建userService:

NoSuchBeanDefinitionException: No matching bean of type [com...service.UserService] found for dependency

解决方法:

如果您混合使用此处可以找到的内容(https://stackoverflow.com/questions/5947162/https-and-self-signed-certificate-issue),将返回的HttpClient配置为具有预先配置的SSLSocketFactory,则可以更改主机名套接字工厂的验证者接受证书,与此类似:

xxx.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) { println("bypassing ssl cert handshaking as configured for self signed cert."); return true; }
});

根据您的配置,除了使用CommonsHttpInvokerRequestExecutor外,您还必须配置使用的HTTPClient和SSL套接字工厂

我知道这可能无法完全回答您的问题,但这是其他搜索的起点!祝您好运,别忘了发布最终解决方案.

标签:ssl,https,ssl-certificate,spring,httpinvoker
来源: https://codeday.me/bug/20191201/2084357.html