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

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,步骤如下:

  1. 编写工具方法加载证书并构建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;
}
  1. 为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:43:21