合并证书链
海外云服务器 40个地区可选 亚太云服务器 香港 日本 韩国
云虚拟主机 个人和企业网站的理想选择 俄罗斯电商外贸虚拟主机 赠送SSL证书
在当今互联网应用快速发展的背景下,数据安全已成为系统设计中不可忽视的核心环节,传统的 HTTP 协议以明文方式传输数据,极易受到中间人攻击(MITM)、窃听或篡改等安全威胁,为保障用户隐私与业务数据的安全,采用基于 SSL/TLS 加密的 HTTPS 协议已成为现代 Web 应用的标准配置。
作为 Java 生态中最流行的后端开发框架之一,Spring Boot 提供了简洁高效的 HTTPS 支持机制,开发者可以通过简单的配置即可启用 SSL 加密通信,本文将系统性地介绍如何在 Spring Boot 项目中安装并配置 SSL 证书,涵盖从测试环境自签名证书生成到生产级 CA 签发证书部署的全流程,并提供常见问题解决方案与最佳实践建议。
为什么需要为 Spring Boot 应用启用 HTTPS?
默认情况下,Spring Boot 启动的应用使用 HTTP 协议运行于 8080 端口,在此模式下,客户端与服务器之间的所有交互数据——包括登录凭证、会话信息、支付记录等敏感内容——均以未加密形式在网络中传输,存在严重的安全隐患。
通过集成 SSL 证书并开启 HTTPS,可以带来以下核心价值:
-
✅ 数据加密传输
所有请求与响应内容均通过 TLS 层加密,有效防止网络嗅探和数据泄露。 -
✅ 服务身份验证
经由可信证书颁发机构(CA)签发的证书可验证服务器真实身份,避免钓鱼网站仿冒。 -
✅ 增强用户信任
浏览器对 HTTPS 网站显示“锁形图标”及“安全”标识,显著提升用户访问信心。 -
✅ 满足合规要求
GDPR、PCI DSS、HIPAA 等国际安全规范明确要求敏感数据必须通过加密通道传输。 -
✅ SEO 优化优势
搜索引擎(如 Google)优先索引 HTTPS 网站,有助于提升搜索引擎排名。
在 Spring Boot 中配置 SSL 不仅是技术层面的升级,更是构建高安全性系统的必要举措。
SSL 证书的主要类型及其适用场景
在开始配置前,了解常见的 SSL 证书类型有助于选择最适合自身架构的方案:
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 🔐 自签名证书(Self-Signed Certificate) | 由开发者自行生成,无需费用,但不被浏览器信任 | 开发调试、内部测试环境 |
| 🌐 CA 签发证书(Certificate Authority) | 由权威机构(如 Let's Encrypt、DigiCert、阿里云、腾讯云)签发,受主流浏览器信任 | 生产环境上线使用 |
| 🌟 通配符证书(Wildcard Certificate) | 支持主域名及所有子域名(如 *.example.com) |
多子域架构或多租户系统 |
| 🧩 多域名证书(SAN Certificate) | 可绑定多个不同域名于同一张证书 | 跨品牌或多站点统一管理 |
💡 建议:开发阶段可使用自签名证书快速验证功能;正式上线务必使用由可信 CA 签发的有效证书。
生成自签名证书(适用于测试环境)
Java 自带的 keytool 工具可用于创建 PKCS#12 格式的密钥库文件(.p12),这是 Spring Boot 推荐使用的格式。
使用 keytool 生成证书
打开终端执行以下命令:
keytool -genkeypair \ -alias springboot-ssl \ -keyalg RSA \ -keysize 2048 \ -storetype PKCS12 \ -keystore keystore.p12 \ -validity 365 \ -dname "CN=localhost, OU=Development, O=MyCompany, L=Beijing, ST=Beijing, C=CN" \ -storepass mypassword \ -keypass mypassword
参数说明:
-alias: 密钥对的别名,用于后续引用。-keystore: 输出的密钥库文件名。-storepass/-keypass: 存储密码与密钥密码(建议生产环境中设置复杂强密码)。-validity: 证书有效期(单位:天),此处设为一年。-dname: 主题名称(Distinguished Name),包含组织、地区等信息。
执行成功后,当前目录将生成一个名为 keystore.p12 的文件,将其复制至项目的资源目录:
src/main/resources/keystore.p12
配置 Spring Boot 启用 HTTPS
Spring Boot 支持通过 application.yml 或 application.properties 文件轻松启用 SSL 功能。
YAML 配置(推荐)
server:
port: 8443
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: mypassword
key-store-type: PKCS12
key-alias: springboot-ssl
protocol: TLS
ciphers: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Properties 配置
server.port=8443 server.ssl.enabled=true server.ssl.key-store=classpath:keystore.p12 server.ssl.key-store-password=mypassword server.ssl.key-store-type=PKCS12 server.ssl.key-alias=springboot-ssl server.ssl.protocol=TLS
⚠️ 注意事项:
- HTTPS 默认端口为
443,但在本地开发时通常使用8443以避免权限冲突(Linux/macOS 需 root 权限才能绑定 1~1023 端口)。- 若需监听 443 端口,请确保具备足够权限或通过反向代理转发。
启动应用后,访问地址变为:
👉 https://localhost:8443
由于是自签名证书,浏览器会提示“您的连接不是私密连接”,点击【高级】→【继续前往】即可临时绕过警告(仅限测试用途)。
部署 CA 签发证书(生产环境推荐)
当应用准备上线时,应替换为由可信 CA 签发的正式证书,若已有 .crt 和 .key 文件,需将其合并转换为 Java 支持的 .p12 格式。
准备材料:
domain.crt:服务器公钥证书domain.key:私钥文件ca-bundle.crt:中间证书链(如有)
使用 OpenSSL 转换格式
openssl pkcs12 -export \ -in domain.crt \ -inkey domain.key \ -chain \ -CAfile ca-bundle.crt \ -name springboot-ssl \ -out keystore.p12
系统将提示输入导出密码,请妥善保管该密码并在 application.yml 中正确填写。
完成后,将新生成的 keystore.p12 替换原文件,并更新配置中的密码信息即可。
✅ 提示:Let’s Encrypt 提供免费 DV 证书,结合 Certbot 可实现自动化续期,适合中小型项目。
强制 HTTP 自动跳转 HTTPS(可选但强烈建议)
为了确保所有流量都走加密通道,建议配置 HTTP 请求自动重定向至 HTTPS。
创建配置类实现端口重定向
@Configuration
public class HttpToHttpsConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
// 添加 HTTP 连接器
tomcat.addAdditionalTomcatConnectors(httpConnector());
return tomcat;
}
@Bean
public Connector httpConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080); // HTTP 访问端口
connector.setSecure(false);
connector.setRedirectPort(8443); // 重定向到 HTTPS


