Spring Boot 2.7 内置 Tomcat 支持通过 application.yml 直接配置 SSL,适合单机部署或内网测试场景,生产环境通常建议由 Nginx 或负载均衡器卸载 SSL。
先说结论:配置项集中在 server.ssl 前缀,需确保证书格式兼容且路径可访问。
- 适合:单机部署、开发测试环境或无需外部负载均衡的简单生产场景
- 先准备:获取合法的证书文件(JKS 或 PKCS12 格式)并确认密码
- 验收:通过 HTTPS 端口访问服务,确认握手成功且无报错
配置示例
直接在 application.yml 中添加以下配置片段,注意替换文件路径和密码。生产环境建议使用环境变量注入密码:
server:port: 8443ssl:key-store: classpath:cert.p12key-store-password: ${SSL_KEY_STORE_PASSWORD:your_password}key-store-type: PKCS12enabled: true原理简述
Spring Boot 启动时会自动检测 classpath 下的嵌入式 Servlet 容器依赖,默认包含 Tomcat。框架通过 Binder 机制将 yml 中的 server.ssl 属性绑定到 Tomcat 的 Connector 配置上,无需手动编写 Tomcat 的 server.xml。
证书准备与转换
1. 生成自签名证书(测试用):使用 JDK 自带 keytool 生成 PKCS12 格式证书。
keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 36502. 转换现有证书:若已有 CRT 和 KEY 文件,使用 OpenSSL 转换为 PKCS12 格式。
openssl pkcs12 -export -in cert.crt -inkey key.key -out keystore.p12 -name tomcat3. 放置文件:将证书文件放入 src/main/resources 目录,这样可以使用 classpath: 前缀引用;若放在服务器特定目录,需使用绝对路径。
安全配置建议
配置文件中明文存储密码存在安全风险,建议采用以下方案:
- 环境变量注入:在 yml 中使用 ${VAR_NAME} 占位,启动时通过环境变量传递密码。
- 配置中心加密:若使用 Nacos 或 Apollo 等配置中心,利用其加密插件管理敏感信息。
- 权限控制:确保证书文件仅应用运行用户可读,避免权限过大。
验证方法
使用 curl 命令测试端口连通性和 SSL 握手:
curl -k https://localhost:8443/actuator/health或在浏览器访问 https://IP:端口,检查地址栏是否有锁形标志。若配置了 HTTP 自动跳转,访问 http 端口应自动重定向到 https。
常见坑
1. 路径错误:classpath: 只能读取打包后的 resources 内容,外部文件需写绝对路径。Linux 下注意文件权限。
2. 端口权限:若配置 server.port 为 443,Linux 非 root 用户可能无法绑定,建议改用 8443 并通过防火墙转发。
3. 密码混淆:key-store-password 是密钥库密码,若证书有单独的 key 密码,可能还需配置 key-password。
4. 格式不兼容:Spring Boot 2.7 默认偏好 PKCS12,若使用 JKS 需显式指定 key-store-type: JKS。
参考来源
Spring Boot Reference Documentation - Web Servers - SSL
URL: https://docs.spring.io/spring-boot/docs/2.7.x/reference/htmlsingle/#web.servlet.embedded-container
原文链接:https://www.zjcp.cc/ask/11731.html
