如何自定义加载指定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
相关产品推荐
相关产品推荐

