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

SpringBoot应用能否直接使用TLS.crt与TLS.key文件?

SpringBoot应用在Kubernetes中直接使用tls.key和tls.crt的实现方式

SpringBoot应用完全可以直接使用tls.key和tls.crt这类PEM格式的证书文件,无需提前转换成PKCS12或JKS格式,通过配置或代码都能实现。

一、通过配置直接实现(推荐)

SpringBoot 2.7及以上版本原生支持PEM格式证书的配置,只需在application.yml或application.properties中指定证书挂载路径即可:

server:
  ssl:
    enabled: true
    # 对应K8s Secret挂载的tls.crt路径
    certificate: file:/etc/ssl/certs/tls.crt
    # 对应K8s Secret挂载的tls.key路径
    certificate-private-key: file:/etc/ssl/certs/tls.key

注:路径需替换为你在K8s中挂载Secret到Pod的实际路径,常见挂载路径如/etc/ssl/certs。

二、通过Java代码灵活实现

如果需要动态加载证书、自定义SSL逻辑等场景,可以通过Java原生API手动解析PEM证书和私钥,再配置到SpringBoot的Web服务器中:

import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.util.Base64;

@Configuration
public class SslCustomConfig {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> sslConfigCustomizer() {
        return factory -> {
            try {
                // 加载X.509格式证书
                CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
                FileInputStream certIn = new FileInputStream("/etc/ssl/certs/tls.crt");
                java.security.cert.Certificate cert = certFactory.generateCertificate(certIn);

                // 解析PKCS#8格式私钥
                FileInputStream keyIn = new FileInputStream("/etc/ssl/certs/tls.key");
                String keyRawContent = new String(keyIn.readAllBytes())
                        .replace("-----BEGIN PRIVATE KEY-----", "")
                        .replace("-----END PRIVATE KEY-----", "")
                        .replaceAll("\\s", "");
                byte[] keyBytes = Base64.getDecoder().decode(keyRawContent);
                PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
                PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

                // 创建临时密钥库并存入证书和私钥
                KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
                keyStore.load(null);
                keyStore.setCertificateEntry("server-cert", cert);
                keyStore.setKeyEntry("server-key", privateKey, new char[0], new java.security.cert.Certificate[]{cert});

                // 初始化SSLContext并配置到Tomcat
                KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                kmf.init(keyStore, new char[0]);
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(kmf.getKeyManagers(), null, null);

                factory.setSslContext(sslContext);
                factory.setPort(443);
            } catch (Exception e) {
                throw new RuntimeException("SSL配置失败", e);
            }
        };
    }
}

注意事项

  • 确保Pod拥有挂载Secret文件的读取权限,K8s挂载Secret时默认权限为644,足以满足证书和私钥的读取需求。
  • 若使用SpringBoot 2.7以下版本,原生不支持PEM配置,建议优先升级版本;也可通过启动脚本用keytool临时转换证书,但代码实现方式更灵活可控。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:48:22