You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot项目信任所有证书配置报错,求解决方案

解决Spring Boot中HttpComponentsClientHttpRequestFactory初始化错误

问题场景

在Spring Boot项目中创建了信任所有证书的RestTemplate配置类,代码如下:

package com.nttdata.iplanet.hubject.utils;

import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

@Configuration
public class TrustAllCertificatesConfig {

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplateBuilder()
                .requestFactory(this::trustAllCertificatesRequestFactory)
                .build();
    }

    private ClientHttpRequestFactory trustAllCertificatesRequestFactory() {
        TrustManager[] trustManagers = new TrustManager[]{new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {}

            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {}

            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }
        }};

        SSLContext sslContext;
        try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            throw new RuntimeException("Failed to initialize SSLContext", e);
        }

        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLContext(sslContext)
                .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
                .build();

        // Utilizzare una versione di HttpComponentsClientHttpRequestFactory compatibile
        // con la versione delle librerie Apache HTTP Client che stai utilizzando.

        // Versione per Apache HTTP Client 4.5.x:
        // return new HttpComponentsClientHttpRequestFactory(httpClient);

        // Versione per Apache HTTP Client 4.3.x:
        return new HttpComponentsClientHttpRequestFactory(httpClient);

    }
}

使用的pom依赖为:

<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.13</version>
</dependency>

在执行return new HttpComponentsClientHttpRequestFactory(httpClient);时出现初始化错误。

解决方案

1. 排查依赖版本兼容性

Spring的HttpComponentsClientHttpRequestFactory类与Apache HttpClient版本存在兼容性要求:

  • 确保Spring Boot版本与httpclient 4.5.13匹配:Spring Boot 2.x系列默认兼容httpclient 4.5.x,若使用Spring Boot 1.x,建议将httpclient版本调整为4.3.x或对应兼容版本。
  • 执行mvn dependency:tree命令,检查是否存在多版本httpclient/httpcore依赖冲突,若有则通过<exclusions>排除低版本或不兼容的依赖。

2. 调整HttpComponentsClientHttpRequestFactory初始化方式

若因构造方法兼容性问题导致错误,可改用无参构造+设置HttpClient的方式:

// 替换原return语句
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;

这种方式兼容性更强,避免直接构造参数带来的版本适配问题。

3. 确认Spring-web依赖版本

确保项目中spring-web依赖版本与httpclient兼容,若使用Spring Boot,无需单独指定spring-web版本,依赖Spring Boot父工程的版本即可,避免手动指定版本导致的冲突。


内容的提问来源于stack exchange,提问作者guido pastore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 09:40:58