Springboot 使用restTemplate发送https请求忽略ssl证书完整方案

Springboot版本:6.x, HttpClient版本:5.x

需求:除了要忽略SSL证书,还要在请求头里加参数。

xml 复制代码
<dependency>
    <groupId>org.apache.httpcomponents.client5</groupId>
    <artifactId>httpclient5</artifactId>
</dependency>
java 复制代码
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
import org.apache.hc.core5.http.HttpRequestInterceptor;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.hc.core5.ssl.TrustStrategy;

public class SSLIgnoreConfig{

    /**
     * 创建忽略证书的请求工厂
     */
    public static ClientHttpRequestFactory insecureRequestFactory() 
            throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
        
        // 信任所有证书的策略
        TrustStrategy acceptingTrustStrategy = (chain, authType) -> true;
        
        // 创建 SSLContext
        SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(acceptingTrustStrategy)
                .build();
        
        // 创建 SSL 连接套接字工厂
        SSLConnectionSocketFactory sslSocketFactory = 
                new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);
        
        // 创建连接管理器
        PoolingHttpClientConnectionManager connectionManager = 
                PoolingHttpClientConnectionManagerBuilder.create()
                        .setSSLSocketFactory(sslSocketFactory)
                        .build();
        
        HttpRequestInterceptor httpRequestInterceptor = (request, entity, context) -> {
        // 关键:在 HttpClient 层面添加额外的头信息
        request.setHeader("key", "47953053953");
        request.setHeader("secret", "dsbkflsehgwlledksv");
    };
        
        // 创建 HttpClient
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(connectionManager)
                .setConnectionManagerShared(true)  // 共享连接管理器
                .evictExpiredConnections()  // 清理过期连接
                .evictIdleConnections(Duration.ofSeconds(30))  // 清理空闲连接
                .build();
        
        // 创建 RequestFactory
        HttpComponentsClientHttpRequestFactory requestFactory = 
                new HttpComponentsClientHttpRequestFactory(httpClient);
        
        
        return requestFactory;
    }
}
less 复制代码
@Configuration
public class RestTemplateConfig {

    //关键:使用RestTemplateBuilder,不要用new RestTemplate()
    @Bean
    @Profile("test")//仅测试环境生效
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        ClientHttpRequestFactory requestFactory = SSLIgnoreConfig.insecureRequestFactory();

        return builder.requestFactory(()->requestFactory).build;
    }
}
csharp 复制代码
private void testPostRequest() {
        System.out.println("\n=== Testing POST Request ===");
        HttpHeaders headers = new HttpHeaders();
        headers.set("key", "test-key");
        headers.set("secret", "test-secret");
        headers.setContentType(MediaType.APPLICATION_JSON);
        
        String requestBody = "{"test":"data"}";
        HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);
        
        try {
            ResponseEntity<String> response = restTemplate.exchange(
                "https://httpbin.org/post",
                HttpMethod.POST,
                entity,
                String.class
            );
            System.out.println("POST Response: " + response.getBody());
        } catch (Exception e) {
            System.err.println("POST Error: " + e.getMessage());
        }
    }
相关推荐
devlei1 小时前
从源码泄露看AI Agent未来:深度对比Claude Code原生实现与OpenClaw开源方案
android·前端·后端
努力的小郑3 小时前
Canal 不难,难的是用好:从接入到治理
后端·mysql·性能优化
Victor3564 小时前
MongoDB(87)如何使用GridFS?
后端
Victor3564 小时前
MongoDB(88)如何进行数据迁移?
后端
小红的布丁4 小时前
单线程 Redis 的高性能之道
redis·后端
GetcharZp4 小时前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
宁瑶琴6 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友6 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
IT_陈寒7 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
Soofjan8 小时前
Go 内存回收-GC 源码1-触发与阶段
后端