目录
[4 ssm项目配置https](#4 ssm项目配置https)
[4.1 介绍](#4.1 介绍)
[4.2 配置流程](#4.2 配置流程)
[4.3 注](#4.3 注)
4 ssm项目配置https
4.1 介绍
以前访问自己写的项目,配置的路径都是http开头的。

以snapan上传文件(文件存储在oss)为例,解释为什么需要配置https。
通过 Spring MVC 的MultipartFile接收分片文件,基于HTTP/1.1 或 HTTP/2 协议,底层使用TCP Socket(由 Servlet 容器如 Tomcat 管理)。
当前的项目部署在 http://localhost:8080/(HTTP 协议),前端与后端之间的传输没有加密,抓包软件能直接捕获明文数据,不安全。
能抓到的部分:前端与后端之间的所有明文数据,包括:
- 上传时的文件分片、fileMD5、chunkIndex 等参数;
- 下载时的文件 ID、请求头信息;
- UploadController 接收的文件原始数据(如图片二进制流)。
但是如果我使用https协议(TLS/SSL 加密),抓包软件只能看到发送的 HTTPS 请求(IP、端口),但无法解析请求体中的文件数据、签名信息(TLS/SSL 加密保护)。
这个snapan项目,后端和 OSS 有交互。无论前端请求是 HTTP 还是 HTTPS,后端调用阿里云 OSS SDK 上传 / 下载文件时,默认使用 HTTPS 协议(TLS/SSL 加密),这是 OSS SDK 的强制配置,与前端请求协议无关。
此时这个项目里,只有后端到oss是加密的,前端到后端没有加密依旧不安全,如果要安全传输就需要让前端到后端的传输使用的是https协议。
4.2 配置流程
目的:浏览器↔后端加密。让服务支持 https://localhost:8443/ 访问,浏览器和后端的所有上传请求都加密,抓包无法获取明文。
-
生成 HTTPS 证书(本地测试用,本地测试用自签名证书,生产用 CA 证书)
打开命令行,输入以下命令(需要 JDK 的 keytool 工具,默认随 JDK 安装):keytool -genkeypair -alias myhttps -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 3650
- 按提示输入信息(全程可填简单值,方便记忆):
- 输入密钥库口令:比如 123456(后续配置要用到,记好)
- 姓氏:随便填(如 snapan)
- 组织单位、组织、城市、省份、国家代码:都随便填(如 snapan、CN)
- 确认信息:输入 y
- 密钥口令:直接回车(和密钥库口令一致)
- 执行完后,会在命令行当前目录生成 keystore.jks 证书文件。

- 放置证书
SSM 项目部署在独立 Tomcat 中,证书要放 Tomcat 的配置目录:
- 找到你部署 SSM 项目的 Tomcat 安装目录(比如 D:\tomcat-8.5.29)
- 进入 tomcat/conf 目录(存放 Tomcat 核心配置的文件夹)
- 把生成的 keystore.jks 文件,复制到 tomcat/conf 目录下(和 server.xml 同级)。

-
配置 Tomcat 的server.xml
打开 Tomcat 目录下的 conf/server.xml 文件,找到并修改 HTTPS 相关配置(默认被注释,解开后改参数):
(1)找到原 HTTPS 配置(默认注释,长这样)
(2)替换为以下配置
<!-- SSM项目HTTPS配置:端口8443,关联我们生成的证书 -->
<Connector
port="8443" <!-- HTTPS端口,和之前一致,避免冲突 -->
protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150"
SSLEnabled="true" <!-- 启用SSL -->
scheme="https" <!-- 协议类型为HTTPS -->
secure="true" <!-- 标记为安全连接 -->
clientAuth="false" <!-- 不需要客户端证书(本地测试用) -->
sslProtocol="TLS" <!-- 加密协议,支持TLSv1.2/TLSv1.3 -->
keystoreFile="conf/keystore.jks" <!-- 证书路径:Tomcat的conf目录下的keystore.jks -->
keystorePass="123456" <!-- 证书密码(生成时填的123456) -->
keystoreType="JKS" <!-- 证书类型(默认JKS,不用改) -->
keyAlias="snapanhttps" <!-- 生成证书时的alias(和命令行一致) -->
/>
-
新建 rewrite.config 文件
在 tomcat/conf 目录下新建 rewrite.config 文件,写入:RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{HTTP_HOST}:84431 [R,L]

- 配置idea中的Tomcat

- 启动项目
此时会出现这个弹框,点接受。
因为idea不信任你用的自签名证书,但这说明你的 HTTPS 配置已经成功生效了。
具体解释如下:
- 提示的本质:
上面用的是keytool生成的是自签名证书(自己给自己发的 "加密身份证"),而不是由权威 CA 机构(比如阿里云、Let's Encrypt)颁发的证书。浏览器 / IDEA 默认只信任权威 CA 的证书,所以会弹出 "证书不受信任" 的提示,但这是本地测试的正常现象,不影响功能。 - 如何判断 HTTPS 已经生效?
出现这个提示,恰恰说明:
我的 Tomcat 已经成功启用了 HTTPS(否则不会触发证书验证);
通信链路已经是加密的(抓包工具只能看到密文)。 - 下一步操作:
点击弹窗右下角的 Accept 按钮,信任这个自签名证书,之后 IDEA 就不会再弹出这个提示,你可以正常通过 HTTPS 访问项目了。

- 浏览器访问
此时会出现这个,点击高级。
这个提示是浏览器对 "自签名证书" 的安全警告,和之前 IDEA 的提示是同一个原因,但不代表 HTTPS 没生效 ------ 实际上你的加密配置已经成功了,只是浏览器默认不信任自己生成的证书。
具体如下:
浏览器显示 "你的连接不是专用连接"+NET::ERR_CERT_AUTHORITY_INVALID,是因为:
- 用keytool生成的证书,没有经过 ** 权威 CA 机构(如 Let's Encrypt、阿里云)** 的签名,浏览器默认会标记为 "不安全";
- 但通信本身已经是加密的(抓包工具只能看到密文,无法解析内容),这个警告只是 "证书来源不可信" 的提示,不是加密失败。

- 继续访问
点击继续访问localhost就可以看到页面了。

- 浏览器页面显示
现在地址栏显示的是https://(只是带了 "不安全" 警告),这说明浏览器已经和你的服务建立了TLS 加密连接------ 因为只有 HTTPS 才会用https://前缀,HTTP 不会。
这个 "不安全" 警告只是针对证书的来源(自签名证书),不是针对加密本身。通信链路已经是加密的(数据不会被明文抓包),只是浏览器觉得 "这个证书不是权威机构发的,可能有风险",但本地测试完全可以忽略。

4.3 注
如果是SpringBoot项目,内置了 Tomcat,就只用在application.yml里面修改配置文件,证书放在项目里。其他逻辑和ssm一样。