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

如何自定义加载指定SSL证书的专属RestTemplate Bean

实现方案

核心逻辑是新增一个独立的、带SSL证书配置的RestTemplate Bean,通过Bean名称和原有全局RestTemplate做区分,不会影响原有业务的RestTemplate使用。

1. 新增SSL RestTemplate配置类

创建独立配置类,定义带特定标识的RestTemplate Bean,示例代码如下:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;

import java.io.InputStream;
import java.security.KeyStore;

@Configuration
public class SslRestTemplateConfig {

    // 自定义SSL RestTemplate的Bean名称,和全局默认的做区分
    @Bean("sslRestTemplate")
    public RestTemplate sslRestTemplate(@Qualifier("sslHttpRequestFactory") HttpComponentsClientHttpRequestFactory factory) {
        RestTemplate restTemplate = new RestTemplate(factory);
        // 此处可按需添加消息转换器、拦截器,和全局RestTemplate保持一致的通用配置
        return restTemplate;
    }

    @Bean("sslHttpRequestFactory")
    public HttpComponentsClientHttpRequestFactory sslHttpRequestFactory() throws Exception {
        // 加载证书文件,建议将证书路径、密码配置在application.yml中,避免硬编码
        char[] keyStorePassword = "你的证书密码".toCharArray();
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        try (InputStream inputStream = getClass().getResourceAsStream("/ssl/你的证书.p12")) {
            keyStore.load(inputStream, keyStorePassword);
        }

        // 构建SSL上下文
        SSLContext sslContext = SSLContextBuilder.create()
                .loadKeyMaterial(keyStore, keyStorePassword)
                // 自签名证书测试场景可添加下面配置跳过信任校验,生产环境不建议使用
                // .loadTrustMaterial((chain, authType) -> true)
                .build();

        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);
        CloseableHttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();

        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setHttpClient(httpClient);
        // 按需设置超时时间
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(10000);
        return factory;
    }
}

2. 特定模块注入使用

需要使用SSL证书的业务模块,通过@Qualifier指定注入自定义的SSL RestTemplate即可:

@Service
public class SpecificModuleService {

    private final RestTemplate sslRestTemplate;

    // 明确指定注入我们自定义的带SSL配置的RestTemplate
    public SpecificModuleService(@Qualifier("sslRestTemplate") RestTemplate sslRestTemplate) {
        this.sslRestTemplate = sslRestTemplate;
    }

    public void callSslApi() {
        // 发起需要证书校验的HTTPS请求
        String result = sslRestTemplate.getForObject("目标HTTPS接口地址", String.class);
    }
}

注意事项

  • 证书路径、密码不要硬编码,建议配置在配置文件中,通过@Value注解读取,方便后续迭代和多环境适配
  • 如果希望复用Spring Boot自动配置的RestTemplate默认配置(比如消息转换器、全局拦截器等),可以注入RestTemplateBuilder来构建自定义的RestTemplate,避免重复配置
  • 生产环境不要开启跳过证书信任校验的配置,避免出现安全风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:10