一、HTTPS 与 HTTP/2 核心原理与优势
在企业项目开发中,HTTP 协议的明文传输缺陷的是数据安全的重大隐患,而 HTTPS + HTTP/2 是目前企业级项目的标准安全+性能组合方案,先搞懂底层逻辑,再落地配置,避免踩坑。
1.1 HTTP 的致命缺陷
HTTP 协议采用明文传输,在数据从客户端到服务器的传输过程中,存在3大核心安全问题,完全无法满足企业等保2.0、用户隐私合规要求:
1.2 HTTPS 核心原理
HTTPS(Hyper Text Transfer Protocol Secure)并非全新协议,而是 HTTP + TLS/SSL 协议 的组合,核心作用是“加密传输、身份认证、防篡改”,本质是在 HTTP 传输层之上增加了一层 SSL/TLS 加密层。
HTTPS 加密流程:
1. 客户端发起 HTTPS 请求,向服务器索要 SSL 证书;2. 服务器返回自身的 SSL 证书(包含公钥、服务器身份信息);3. 客户端验证证书合法性(是否过期、是否被篡改、是否由权威机构颁发);4. 验证通过后,客户端生成随机密钥,用服务器公钥加密后发送给服务器;5. 服务器用自身私钥解密,得到随机密钥;6. 双方后续所有通信,均使用该随机密钥进行对称加密,实现明文转密文传输。
关键说明:SSL 与 TLS 本质是同一类协议,TLS 是 SSL 的升级版本(目前主流使用 TLS 1.2/TLS 1.3,已淘汰 SSL 3.0)。
1.3 HTTPS 核心作用1.4 HTTP/2 核心优势
HTTP/2 是 HTTP 协议的重大升级,必须基于 HTTPS 才能启用(主流浏览器仅支持 HTTPS 下的 HTTP/2),核心解决 HTTP 1.1 的性能瓶颈,优势如下:
实测对比:HTTP/2 比 HTTP 1.1 接口响应速度提升 30%-50%,高并发场景下优势更明显。
二、SSL 证书详解与生成
SSL 证书是 HTTPS 实现的核心,相当于服务器的“身份凭证”,分为「自签名证书」(本地测试用)和「权威机构证书」(生产用),两者区别、生成方法、使用场景全部讲透。
2.1 SSL 证书类型对比
证书类型
适用场景
优势
劣势
自签名证书
本地开发、测试环境
免费、生成快速、无需审核

无权威机构认证,浏览器提示“不安全”
权威机构免费证书
个人项目、小型企业、测试环境
免费、权威认证、浏览器信任
有效期短(通常1年)、仅支持单域名
权威机构付费证书
生产环境、企业项目、多域名场景
有效期长、多域名支持、更高安全等级、售后保障
需要付费、审核严格
生产环境推荐:阿里云、腾讯云申请免费权威证书(如 Let's Encrypt、阿里云免费 SSL),足够满足大部分企业需求;大型企业、多域名场景可选择付费证书。
2.2 方式1:本地测试用自签名证书
本地开发无需权威证书,使用 JDK 自带的 keytool 工具即可快速生成,步骤如下(全程复制命令,无需修改):
1. 打开终端(Windows 用 CMD/PowerShell,Mac/Linux 用终端);2. 进入 JDK 的 bin 目录(若配置了 JDK 环境变量,可直接在任意目录执行);3. 执行生成命令(密码统一设置为 123456,方便后续配置):
keytool -genkey -alias tomcat -keyalg RSA -keysize 2048 -validity 3650 -keystore server.jks
命令参数说明:
执行命令后,会提示输入姓名、组织、城市等信息,全部随便输入即可(本地测试无需真实信息),最后确认“是”,即可生成 server.jks 文件。
将生成的 server.jks 文件,复制到 SpringBoot 项目的 resources 目录下(直接放在根目录,无需创建子文件夹)。
2.3 方式2:生产环境权威证书
生产环境必须使用权威机构颁发的证书,否则浏览器会提示“不安全”,影响用户信任,这里以阿里云为例,讲解免费证书的申请与下载流程(腾讯云流程类似):
1. 登录阿里云控制台,搜索“SSL证书”,进入证书管理页面;2. 点击“申请证书”,选择“免费证书”(Let's Encrypt 或阿里云免费版),点击“立即申请”;3. 填写域名信息(如 www.xxx.com),验证域名所有权(推荐 DNS 验证,操作最简单);4. 验证通过后,等待 1-10 分钟,证书即可颁发;5. 证书颁发后,点击“下载”,选择“JKS”格式(SpringBoot 原生支持,若用 Nginx 部署,可选择 PEM 格式);6. 下载后会得到两个文件:xxx.jks(证书文件)和 keystorePassword.txt(证书密码),将 xxx.jks 重命名为 server.jks(方便配置),复制到项目 resources 目录下。
注意:生产证书有效期通常为 1 年,到期前需提前续期(阿里云会有提醒,续期流程和申请一致,免费续期)。
2.4 证书格式说明

SpringBoot 支持多种 SSL 证书格式,核心两种:
三、SpringBoot 开启 HTTPS + HTTP/2
SpringBoot 2.0+ 对 HTTPS 和 HTTP/2 提供了原生支持,无需额外引入依赖,仅需简单配置即可开启,全程复制代码,一步到位。
3.1 pom.xml 依赖
SpringBoot Web 依赖已内置 Tomcat 容器和 SSL 相关组件,无需额外引入依赖,核心依赖如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.7.18
com.example
springboot-https-http2
0.0.1-SNAPSHOT
springboot-https-http2
1.8
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
true
3.2 application.yml 核心配置
配置 HTTPS 端口、SSL 证书、HTTP/2,注释详细,可直接复制,仅需修改证书密码(生产环境替换为自己的证书密码):
server:
# HTTPS 默认端口:443(生产环境必须用443,浏览器可省略端口访问)
port: 443
# 开启 HTTP/2 协议(必须基于 HTTPS 才能生效)
http2:
enabled: true
# SSL 证书核心配置
ssl:
enabled: true # 开启 SSL 加密(即开启 HTTPS)
key-store: classpath:server.jks # 证书文件路径(resources 目录下)
key-store-type: JKS # 证书格式(JKS 或 PFX,根据自己的证书修改)
key-store-password: 123456 # 证书密码(自签名证书是123456,生产证书是下载时的密码)
key-alias: tomcat # 证书别名(与生成证书时的 -alias 一致)
key-password: 123456 # 私钥密码(通常与证书密码一致,可省略,默认与 key-store-password 相同)
# 生产环境额外配置:强加密套件(提升安全性,避免弱加密被攻击)
ciphers: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
# 生产环境额外配置:禁用不安全的 TLS 版本(仅保留 TLS 1.2/TLS 1.3)
enabled-protocols: TLSv1.2,TLSv1.3
3.3 启动测试1. 启动 SpringBoot 项目,控制台无报错,说明配置成功;2. 打开浏览器,访问:https://localhost(无需输入端口,443是默认端口);3. 本地自签名证书:浏览器会提示“您的连接不是私密连接”,点击“高级”→“继续访问”(正常现象,生产证书无此提示);4. 生产权威证书:浏览器地址栏会显示「小锁图标」,说明 HTTPS 生效。四、HTTP 自动跳转 HTTPS
用户习惯输入 http://xxx.com(如 http://localhost),若不配置跳转,会提示无法访问,影响用户体验。企业项目必须配置:所有 HTTP 请求(80端口)自动 302 跳转到 HTTPS 请求(443端口),实现全站 HTTPS。
4.1 跳转配置类
SpringBoot 默认使用 Tomcat 容器,编写配置类,开启 80 端口监听,实现自动跳转,代码可直接复制:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.apache.catalina.connector.Connector;
@Configuration
public class HttpToHttpsConfig {
@Bean
public ServletWebServerFactory servletWebServerFactory() {
// 基于 Tomcat 容器配置
TomcatServletWebServerFactory tomcatFactory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(org.apache.catalina.Context context) {
// 关闭 Tomcat 自身的 HTTP 缓存(可选,提升安全性)
org.apache.catalina.webresources.StandardRoot root = new org.apache.catalina.webresources.StandardRoot(context);
root.setCacheMaxSize(0);
context.setResources(root);
}
};
// 配置 HTTP 连接器(监听 80 端口)
Connector httpConnector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
httpConnector.setScheme("http"); // 协议类型
httpConnector.setPort(80); // HTTP 监听端口
httpConnector.setSecure(false); // 非安全连接(HTTP 无加密)
httpConnector.setRedirectPort(443); // 跳转目标端口(HTTPS 443 端口)
// 将 HTTP 连接器添加到 Tomcat 容器
tomcatFactory.addAdditionalTomcatConnectors(httpConnector);
return tomcatFactory;
}
}
4.2 跳转测试1. 重启 SpringBoot 项目(配置类修改后需重启);2. 打开浏览器,访问:http://localhost(80端口);3. 浏览器会自动跳转到 https://localhost,地址栏显示小锁图标,跳转成功。4.3 注意事项五、HTTP/2 开启验证与性能优化
HTTP/2 已在 application.yml 中配置 http2.enabled: true,但需验证是否真正生效,同时可做一些性能优化,发挥 HTTP/2 的最大优势。
5.1 HTTP/2 生效验证方法1:Chrome 浏览器验证1. 访问 https://localhost,打开 Chrome 开发者工具(F12);2. 切换到「Network」标签页,刷新页面;3. 查看「Protocol」列,若显示「h2」,说明 HTTP/2 开启成功;若显示「http/1.1」,说明未生效。方法2:命令行验证
执行以下命令,查看响应头中的「HTTP/2」标识:
curl -I https://localhost
若输出中包含「HTTP/2 200」,说明 HTTP/2 生效。
方法3:在线工具验证

访问在线 HTTPS 检测工具(如 https://http2.pro/),输入自己的域名,工具会自动检测是否开启 HTTP/2,同时检测证书合法性、加密套件等。
5.2 HTTP/2 未生效的常见原因5.3 HTTP/2 性能优化
Gzip 压缩配置(添加到 application.yml):
server:
compression:
enabled: true # 开启 Gzip 压缩
mime-types: text/html,text/xml,text/plain,application/json,application/javascript # 压缩类型
min-response-size: 1024 # 最小压缩体积(小于1KB不压缩)
六、生产环境最佳实践
本地配置完成后,生产环境部署需注意以下细节,避免安全漏洞、性能瓶颈,同时满足合规要求。
6.1 端口与证书配置6.2 安全加固配置(1)开启 HSTS 强制 HTTPS
HSTS(HTTP Strict Transport Security)强制浏览器只能通过 HTTPS 访问,即使用户输入 HTTP,也会直接跳转 HTTPS,避免中间人劫持,配置如下(添加到配置类):
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Configuration
public class WebSecurityConfig implements WebMvcConfigurer {
@Bean
public Filter hstsFilter() {
return new Filter() {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
// max-age=31536000:HSTS 有效期1年,includeSubDomains:包含所有子域名
httpResponse.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
chain.doFilter(request, response);
}
};
}
}
(2)配置强加密套件
禁用弱加密套件(如 SSL 3.0、TLS 1.0/1.1),仅保留强加密套件,避免被攻击,配置已在 application.yml 中添加,再次强调:
server:
ssl:
ciphers: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
enabled-protocols: TLSv1.2,TLSv1.3
(3)关闭 Tomcat 版本泄露
Tomcat 会在响应头中泄露版本信息,可能被攻击者利用,配置关闭:
server:
tomcat:
server-header: "" # 清空服务器响应头,隐藏 Tomcat 版本
6.3 证书续期与备份6.4 容器部署适配(Nginx + SpringBoot)
企业生产环境通常用 Nginx 反向代理 SpringBoot 项目,此时可将 HTTPS 配置在 Nginx 层面(推荐),SpringBoot 内部关闭 HTTPS,仅提供 HTTP 服务,流程如下:
1. SpringBoot 配置:关闭 HTTPS,端口改为 8080(内部端口);2. Nginx 配置:开启 HTTPS、HTTP/2,配置 80 跳转 443,反向代理到 8080 端口;3. 优势:集中管理证书、支持负载均衡、提升并发性能。
Nginx 核心配置示例(参考):
server {
listen 80;
server_name www.xxx.com;
# HTTP 跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.xxx.com;
# SSL 证书配置
ssl_certificate /usr/local/ssl/server.pem; # PEM 格式证书
ssl_certificate_key /usr/local/ssl/server.key; # 私钥
# 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
# 反向代理到 SpringBoot 8080 端口
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
学习本就是一个长期积累的过程,没有捷径,唯有坚持。希望这些干货能够真正帮到你,学以致用,不断提升,在自己的领域里越走越远。喜欢本文,别忘了点赞、在看、转发,我们下期干货继续!




