Spring Boot内嵌Tomcat如何配置pem格式SSL证书
核心结论
- 服务器系统层面安装的SSL证书无法直接被内嵌Tomcat的Spring Boot应用复用,内嵌容器独立运行,不依赖系统级证书配置
- 你持有的3份PEM格式证书(根证书、中间证书、域名证书)可直接用于配置,无需重新申请证书
- 注意:配置需要用到你申请证书时,本地生成CSR文件对应的私钥文件(通常为.key格式,CA不会存储和下发你的私钥,若私钥丢失需要重新签发证书)
具体配置步骤
1. 合并证书链并生成Tomcat可用的密钥库
内嵌Tomcat不支持直接加载分散的PEM证书,需要先将证书和私钥打包为PKCS12格式的密钥库:
- 按顺序合并证书文件:新建
fullchain.pem文件,依次粘贴域名证书→中间证书→根证书的完整内容,每个证书的-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----标识必须完整保留,不要截断或打乱顺序。 - 执行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
相关产品推荐
相关产品推荐

