Spring Boot 2.7.12中org.springframework.boot.ssl导入无法解决求助
解决Spring Boot 2.7.12中
org.springframework.boot.ssl无法导入的问题 问题原因
Spring Boot 2.7.12版本不包含org.springframework.boot.ssl包及相关API,SslBundles和基于PEM的SSL Bundle配置是Spring Boot 3.0+才新增的特性,所以你在2.7.12版本中无法导入该类。
解决方案
方案一:升级到Spring Boot 3.0及以上版本
如果项目允许版本升级,直接将Spring Boot版本提升至3.0或更高,你的现有代码和application.properties配置无需修改,即可正常使用SSL Bundle功能。
方案二:在Spring Boot 2.7.12中手动配置SSL
若无法升级版本,需手动为RestTemplate构建SSL上下文替代SSL Bundle,步骤如下:
- 编写工具方法加载证书并构建SSLContext
import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import javax.net.ssl.*; import java.io.InputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.security.KeyFactory; import java.util.Base64; public SSLContext createSslContext() throws Exception { // 加载客户端证书 CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); X509Certificate clientCert; try (InputStream is = getClass().getResourceAsStream("/client_cert.crt")) { clientCert = (X509Certificate) certFactory.generateCertificate(is); } // 加载并解析私钥(PKCS#8格式) String privateKeyStr; try (InputStream is = getClass().getResourceAsStream("/private.key")) { privateKeyStr = new String(is.readAllBytes()) .replaceAll("-----BEGIN PRIVATE KEY-----", "") .replaceAll("-----END PRIVATE KEY-----", "") .replaceAll("\\s", ""); } byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec); // 构建客户端密钥库 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, null); keyStore.setCertificateEntry("clientCert", clientCert); keyStore.setKeyEntry("privateKey", privateKey, "my_pass".toCharArray(), new X509Certificate[]{clientCert}); // 构建信任库(服务端证书) KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); trustStore.load(null, null); try (InputStream is = getClass().getResourceAsStream("/server_cert.crt")) { X509Certificate serverCert = (X509Certificate) certFactory.generateCertificate(is); trustStore.setCertificateEntry("serverCert", serverCert); } // 初始化SSLContext KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, "my_pass".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); return sslContext; }
- 为RestTemplate配置SSL上下文
private final RestTemplate restTemplate; public DisbursementController(RestTemplateBuilder restTemplateBuilder) throws Exception { SSLContext sslContext = createSslContext(); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setSslContext(sslContext); this.restTemplate = restTemplateBuilder.requestFactory(() -> requestFactory).build(); }
内容的提问来源于stack exchange,提问作者Md. Sakhawath Hossain
相关产品推荐
相关产品推荐

