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());
        }
    }
相关推荐
2601_962055976 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿7 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_21696290968 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理9 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒10 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构11 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构11 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构11 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常12 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端
LinMINGJing00712 小时前
PageHeaderData:Page 的页面头
后端