首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring中用于HTTPS的AllowAllHostnameVerifier

Spring中用于HTTPS的AllowAllHostnameVerifier
EN

Stack Overflow用户
提问于 2015-12-12 17:19:28
回答 2查看 1.2K关注 0票数 1

我正在尝试使用Spring进行HTTPS REST调用,下面是我的配置。

代码语言:javascript
复制
<int-http:outbound-gateway
        id="Auth Outbound Gateway"
        request-channel="RequestChannel"
        request-factory="sslFactory"
        header-mapper="headerMapper"
        url="https://XX.XX.XX.XXX:XXXX/abcd"
        http-method="POST"
        expected-response-type="java.lang.String">
</int-http:outbound-gateway>

<bean id="sslFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
    <constructor-arg ref="httpClient"/>
</bean>

<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig"
      factory-method="custom">
    <property name="socketTimeout" value="10000" />
    <property name="connectTimeout" value="10000" />
</bean>

<bean id="requestConfig" factory-bean="requestConfigBuilder" factory-method="build" />

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder"
      factory-method="create">
    <property name="defaultRequestConfig" ref="requestConfig" />
</bean>

<bean id="httpClient" factory-bean="httpClientBuilder" factory-method="build" />

我收到以下错误..。

代码语言:javascript
复制
javax.net.ssl.SSLException: hostname in certificate didn't match: <XX.XX.XX.XXX> != <abc.abc.xyz.com>

为了解决这个问题,我不想使用AllowAllHostnameVerifier,因为我调用的是内部REST服务。

代码语言:javascript
复制
CloseableHttpClient httpClient = HttpClients.custom().setHostnameVerifier(SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).build();

但是如何在我的spring配置xml中连接上述java行呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-14 03:58:40

自定义Java

代码语言:javascript
复制
public class HttpClientFactory extends AbstractFactoryBean<HttpClient> {

    @Override
    public Class<?> getObjectType() {
        return HttpClient.class;
    }

    @Override
    protected HttpClient createInstance() throws Exception {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        TrustStrategy allTrust = new TrustStrategy() {
            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                return true;
            }
        };

        SSLContext sslcontext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, allTrust).build();

        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
        CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

        return httpClient;
    }
}

XML配置

代码语言:javascript
复制
<!--SSL-->
<bean id="sslFactory" class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
    <constructor-arg ref="httpClient"/>
</bean>
<bean id="httpClient" class="org.springframework.integration.samples.http.HttpClientFactory" />
票数 2
EN

Stack Overflow用户

发布于 2015-12-13 14:47:57

HttpClients.custom()返回一个HttpClientBuilder,因此只需将构建器bean和客户端bean替换为您自己的返回HttpClient的bean(在设置defaultRequestConfig之后)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34242723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档