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

Spring Boot内嵌Tomcat如何配置pem格式SSL证书

核心结论
  • 服务器系统层面安装的SSL证书无法直接被内嵌Tomcat的Spring Boot应用复用,内嵌容器独立运行,不依赖系统级证书配置
  • 你持有的3份PEM格式证书(根证书、中间证书、域名证书)可直接用于配置,无需重新申请证书
  • 注意:配置需要用到你申请证书时,本地生成CSR文件对应的私钥文件(通常为.key格式,CA不会存储和下发你的私钥,若私钥丢失需要重新签发证书)
具体配置步骤

1. 合并证书链并生成Tomcat可用的密钥库

内嵌Tomcat不支持直接加载分散的PEM证书,需要先将证书和私钥打包为PKCS12格式的密钥库:

  1. 按顺序合并证书文件:新建fullchain.pem文件,依次粘贴域名证书→中间证书→根证书的完整内容,每个证书的-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----标识必须完整保留,不要截断或打乱顺序。
  2. 执行openssl命令生成PKCS12密钥库:
    openssl pkcs12 -export \
      -in fullchain.pem \
      -inkey 你的私钥文件路径.key \
      -out keystore.p12 \
      -name tomcat \
      -passout pass:你自定义的密钥库密码
    
    执行完成后当前目录会生成keystore.p12文件,请记住你设置的密钥库密码,后续配置需要使用。

2. 配置Spring Boot参数

将生成的keystore.p12放到Spring Boot项目的src/main/resources目录下,然后在配置文件中添加SSL相关参数:

application.properties 配置示例

# 服务端口设为你需要的8088
server.port=8088
# 开启SSL
server.ssl.enabled=true
# 密钥库路径,若部署到服务器用绝对路径可替换为file:/path/keystore.p12
server.ssl.key-store=classpath:keystore.p12
# 填写上一步你设置的密钥库密码
server.ssl.key-store-password=你的密钥库密码
# 密钥库类型固定为PKCS12
server.ssl.key-store-type=PKCS12
# 密钥别名和生成时的-name参数保持一致,这里用tomcat即可
server.ssl.key-alias=tomcat

application.yml 配置示例

server:
  port: 8088
  ssl:
    enabled: true
    key-store: classpath:keystore.p12
    key-store-password: 你的密钥库密码
    key-store-type: PKCS12
    key-alias: tomcat

配置完成后启动应用,即可通过https://server.name.com:8088访问服务。

3. 可选配置:HTTP自动跳转HTTPS

如果需要同时监听HTTP端口(比如80端口)并自动跳转到HTTPS,可添加如下Tomcat配置类:

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SslConfig {
    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint constraint = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(httpConnector());
        return factory;
    }

    private Connector httpConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        // 监听的HTTP端口,可自行修改
        connector.setPort(80);
        connector.setSecure(false);
        // 跳转到的HTTPS端口,和你配置的server.port保持一致
        connector.setRedirectPort(8088);
        return connector;
    }
}
常见问题说明
  • 如果你当前服务前已经部署了Nginx、Apache等反向代理,且已经在代理层完成了SSL证书安装,不需要再在Spring Boot中配置SSL,直接让代理层走HTTP协议转发请求到Spring Boot的服务端口即可,性能损耗更低,配置更简单。
  • 若启动后浏览器提示证书链不受信任,检查fullchain.pem的证书拼接顺序,必须是域名证书在前、中间证书居中、根证书在最后,顺序错误会导致证书链验证失败。
  • 若启动提示端口占用,检查8088端口是否已经被服务器上的Nginx、Apache等其他服务占用,避免端口冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:39:38