SpringBoot配置HTTPS的詳細步驟
做項目時,只要涉及“用戶登錄、支付、敏感數(shù)據(jù)傳輸”,就必須用 HTTPS——否則數(shù)據(jù)在網(wǎng)絡(luò)上明文傳輸,很容易被劫持、篡改。
HTTPS 是不是只能買證書?自簽名證書能不能用?SpringBoot 里怎么配?
今天就把 SpringBoot 配置 HTTPS 的全流程講透:
- 開發(fā)環(huán)境:生成自簽名證書(免費,不用花錢);
- 生產(chǎn)環(huán)境:配置正式 SSL 證書(阿里云/騰訊云免費申請);
- 額外技巧:配置 HTTP 自動跳轉(zhuǎn) HTTPS(用戶輸 http 也能自動到 https)。
純實操,跟著做就能搞定,再也不用怕“HTTPS 配置報錯”。
先搞懂核心:HTTPS 證書的兩種類型
| 證書類型 | 自簽名證書(開發(fā)/測試用) | 正式 SSL 證書(生產(chǎn)用) |
|---|---|---|
| 核心特點 | 自己生成,免費,瀏覽器會提示“不安全” | 權(quán)威機構(gòu)簽發(fā),免費/付費,瀏覽器信任 |
| 適用場景 | 本地開發(fā)、測試環(huán)境 | 生產(chǎn)環(huán)境、對外提供服務(wù)的項目 |
| 獲取方式 | 用 JDK 的 keytool 命令生成 | 阿里云/騰訊云/Let's Encrypt 申請 |
| 瀏覽器表現(xiàn) | 標紅、提示“證書不受信任” | 顯示綠色小鎖,提示“安全” |
一句話總結(jié):開發(fā)用自簽名(省錢、方便),生產(chǎn)用正式證書(安全、用戶體驗好)。
開發(fā)環(huán)境——生成自簽名證書
JDK 自帶 keytool 工具,不用裝額外軟件,一行命令就能生成證書。
第一步:生成自簽名證書
打開命令行(Windows 用 cmd,Linux/Mac 用終端),執(zhí)行以下命令:
# 生成 JKS 格式證書(SpringBoot 推薦格式) keytool -genkeypair-alias springboot-https -keyalg RSA -keysize2048-storetype JKS -keystore springboot-https.jks -validity3650
命令參數(shù)解釋(不用記,直接復(fù)制用):
-alias:證書別名(隨便起,比如 springboot-https);
-keyalg:加密算法(RSA,通用);
-keysize:密鑰長度(2048,足夠安全);
-storetype:證書格式(JKS,SpringBoot 支持);
-keystore:證書文件名(springboot-https.jks);
-validity:有效期(3650 天,約10年)。
執(zhí)行命令后,會提示輸入信息,按提示填(開發(fā)環(huán)境隨便填,不用真實信息):
輸入密鑰庫口令: 123456 (設(shè)置證書密碼,記下來,后面要用到) 再次輸入新口令: 123456 您的名字與姓氏是什么? [Unknown]: localhost 您的組織單位名稱是什么? [Unknown]: dev 您的組織名稱是什么? [Unknown]: test 您所在的城市或區(qū)域名稱是什么? [Unknown]: beijing 您所在的省/市/自治區(qū)名稱是什么? [Unknown]: beijing 該單位的雙字母國家/地區(qū)代碼是什么? [Unknown]: CN CN=localhost, OU=dev, O=test, L=beijing, ST=beijing, C=CN 是否正確? [否]: y 輸入的密鑰口令: (直接回車,和密鑰庫口令一致)
執(zhí)行完成后,當前目錄會生成 springboot-https.jks 文件(這就是自簽名證書)。
第二步:把證書放到項目里
把生成的 springboot-https.jks 復(fù)制到 SpringBoot 項目的 src/main/resources 目錄下(方便讀?。?/p>
第三步:配置 application.yml 啟用 HTTPS
server: port:443# HTTPS 默認端口是 443(不用8080了) ssl: # 證書路徑(resources 下的 jks 文件) key-store: classpath:springboot-https.jks # 證書格式(JKS) key-store-type: JKS # 證書別名(和生成時的 -alias 一致) key-alias: springboot-https # 證書密碼(生成時設(shè)置的 123456) key-store-password:123456
第四步:啟動項目,測試 HTTPS
- 啟動 SpringBoot 項目,日志里沒有報錯,說明配置成功;
- 打開瀏覽器,訪問
https://localhost(不用加端口,443 是默認端口); - 瀏覽器會提示“您的連接不是私密連接”(自簽名證書的正常現(xiàn)象),點擊“高級”→“繼續(xù)訪問localhost(不安全)”;
- 能正常訪問接口,說明 HTTPS 配置成功。
開發(fā)環(huán)境小技巧:如果想去掉瀏覽器的“不安全”提示,可以把自簽名證書導(dǎo)入瀏覽器(具體步驟因瀏覽器而異,開發(fā)環(huán)境可忽略,不影響功能)。
生產(chǎn)環(huán)境——配置正式 SSL 證書
生產(chǎn)環(huán)境不能用自簽名證書(用戶看到“不安全”會不敢訪問),需要用權(quán)威機構(gòu)簽發(fā)的正式證書。
第一步:申請正式 SSL 證書(以阿里云為例,免費)
- 登錄阿里云官網(wǎng) → 搜索“SSL 證書” → 進入證書管理控制臺;
- 點擊“購買證書” → 選擇“免費版 DV SSL”(個人/小企業(yè)夠用) → 提交訂單(免費);
- 填寫域名(比如
www.xxx.com) → 驗證域名(阿里云會自動驗證,不用手動操作); - 驗證通過后,下載證書(選擇“Tomcat”格式,下載后是 zip 包)。
第二步:處理正式證書(轉(zhuǎn)換成 JKS 格式)
阿里云下載的證書包含 xxx.pem 和 xxx.key 文件,需要轉(zhuǎn)換成 SpringBoot 支持的 JKS 格式:
- 解壓下載的 zip 包,得到兩個文件:
www.xxx.com.pem(公鑰)、www.xxx.com.key(私鑰); - 用 OpenSSL 工具轉(zhuǎn)換成 PKCS12 格式(先裝 OpenSSL,Windows 可下載 OpenSSL 安裝包):```bash openssl pkcs12 -export -in www.xxx.com.pem -inkey www.xxx.com.key -out www.xxx.com.p12 -name springboot-https ```
- 用 keytool 把 PKCS12 轉(zhuǎn)換成 JKS 格式:```bash keytool -importkeystore -srckeystore www.xxx.com.p12 -srcstoretype PKCS12 -destkeystore www.xxx.com.jks -deststoretype JKS ```
- 輸入密碼(設(shè)置一個新密碼,記下來),完成轉(zhuǎn)換,得到
www.xxx.com.jks文件。
第三步:配置生產(chǎn)環(huán)境 HTTPS
- 把
www.xxx.com.jks復(fù)制到項目src/main/resources目錄; - 修改
application.yml(生產(chǎn)環(huán)境配置):```yaml server: port: 443 # 生產(chǎn)環(huán)境 HTTPS 默認端口 ssl: key-store: classpath:www.xxx.com.jks # 正式證書文件名 key-store-type: JKS key-alias: springboot-https # 和轉(zhuǎn)換時的 -name 一致 key-store-password: 你的證書密碼 # 轉(zhuǎn)換時設(shè)置的密碼 # 可選:開啟 HTTP2(提升性能) http2: enabled: true ``` - 打包部署項目,訪問
https://www.xxx.com,瀏覽器會顯示綠色小鎖,提示“安全”。
高級技巧——HTTP 自動跳轉(zhuǎn) HTTPS
用戶可能會輸入 http://www.xxx.com(HTTP),需要自動跳轉(zhuǎn)到 https://www.xxx.com(HTTPS),配置如下:
第一步:配置 HTTP 端口(比如 80)
server: port:443# HTTPS 端口 ssl: # 省略 HTTPS 證書配置... # 配置 HTTP 端口(80) http: port:80
第二步:添加跳轉(zhuǎn)配置類
importorg.apache.catalina.Context;
importorg.apache.catalina.connector.Connector;
importorg.apache.tomcat.util.descriptor.web.SecurityCollection;
importorg.apache.tomcat.util.descriptor.web.SecurityConstraint;
importorg.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
importorg.springframework.boot.web.servlet.server.ServletWebServerFactory;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
@Configuration
publicclassHttpsConfig{
// 配置 HTTP 端口(80)
@Value("${server.http.port:80}")
privateint httpPort;
// 配置 HTTPS 端口(443)
@Value("${server.port:443}")
privateint httpsPort;
// 核心:創(chuàng)建 HTTP 連接器,自動跳轉(zhuǎn) HTTPS
@Bean
publicServletWebServerFactoryservletWebServerFactory(){
TomcatServletWebServerFactory tomcat =newTomcatServletWebServerFactory(){
@Override
protectedvoidpostProcessContext(Context context){
SecurityConstraint securityConstraint =newSecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");// 強制使用 HTTPS
SecurityCollection collection =newSecurityCollection();
collection.addPattern("/*");// 所有路徑都跳轉(zhuǎn)
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
// 添加 HTTP 連接器
tomcat.addAdditionalTomcatConnectors(createHttpConnector());
return tomcat;
}
// 創(chuàng)建 HTTP 連接器
privateConnectorcreateHttpConnector(){
Connector connector =newConnector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(httpPort);// HTTP 端口
connector.setSecure(false);
connector.setRedirectPort(httpsPort);// 跳轉(zhuǎn)到 HTTPS 端口
return connector;
}
}配置完成后,訪問 http://www.xxx.com 會自動跳轉(zhuǎn)到 https://www.xxx.com,用戶體驗更好。
必避的 4 個坑
證書密碼錯誤:
啟動報錯 java.io.IOException: Keystore was tampered with, or password was incorrect;
解決:核對 key-store-password 是否和生成/轉(zhuǎn)換證書時的密碼一致。
證書別名錯誤:
啟動報錯 Alias name springboot-https does not exist;
解決:key-alias 必須和生成證書時的 -alias 一致。
端口被占用:
443/80 端口被其他程序占用(比如 IIS、Nginx),啟動報錯 Address already in use;
解決:要么殺掉占用端口的進程,要么臨時改端口(比如 HTTPS 用 8443,HTTP 用 8080)。
正式證書域名不匹配:
訪問 https://xxx.com 提示“證書域名不匹配”;
解決:申請證書時的域名必須和訪問的域名一致(比如申請 www.xxx.com,就不能用 xxx.com 訪問)。
生產(chǎn)環(huán)境額外建議
證書過期提醒:正式證書有有效期(免費版一般1年),記得提前續(xù)期;
Nginx 反向代理 HTTPS:生產(chǎn)環(huán)境建議用 Nginx 配置 HTTPS(性能更好),SpringBoot 只處理業(yè)務(wù)邏輯;
禁用 HTTP 端口:如果不需要跳轉(zhuǎn),直接禁用 80 端口,只開放 443;
配置 SSL 協(xié)議:只啟用 TLS 1.2/1.3(禁用老的 SSLv3/TLS 1.0),提升安全性:```yaml server: ssl: enabled-protocols: TLSv1.2,TLSv1.3 ciphers: ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256 ```
最后說兩句
HTTPS 配置看似復(fù)雜,核心就三步:
- 開發(fā)環(huán)境:用 keytool 生成自簽名證書,配置 443 端口;
- 生產(chǎn)環(huán)境:申請正式證書,轉(zhuǎn)換成 JKS 格式,配置 HTTPS;
- 可選:配置 HTTP 自動跳轉(zhuǎn) HTTPS,提升用戶體驗。
不管是自簽名還是正式證書,配置邏輯都是一樣的——只是證書的來源不同。做好 HTTPS 配置,是保障項目數(shù)據(jù)安全的基礎(chǔ),也是生產(chǎn)環(huán)境上線的必備條件。
以上就是SpringBoot配置HTTPS的詳細步驟的詳細內(nèi)容,更多關(guān)于SpringBoot配置HTTPS的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring JdbcTemplate整合使用方法及原理詳解
這篇文章主要介紹了Spring JdbcTemplate整合使用方法及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08
Java實現(xiàn)數(shù)字金額轉(zhuǎn)換為中文大寫金額的完整指南與優(yōu)化技巧
在金融、財務(wù)和商務(wù)系統(tǒng)中,將數(shù)字金額轉(zhuǎn)換為中文大寫金額是一項常見需求,中文大寫金額能有效避免篡改和歧義,是合同、發(fā)票等正式場景的規(guī)范要求,本文將通過Java實現(xiàn)這一功能,需要的朋友可以參考下2025-12-12
SpringBoot項目執(zhí)行腳本 自動拉取最新代碼并重啟的實例內(nèi)容
在本篇文章里小編給大家整理的是一篇關(guān)于SpringBoot項目執(zhí)行腳本 自動拉取最新代碼并重啟的實例內(nèi)容,有需要的朋友們參考下。2019-12-12
Spring?Boot中自動執(zhí)行sql腳本的方法實例
在SpringBoot的架構(gòu)中,DataSourceInitializer類可以在項目啟動后初始化數(shù)據(jù),我們可以通過自動執(zhí)行自定義sql腳本初始化數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Spring?Boot中自動執(zhí)行sql腳本的相關(guān)資料,需要的朋友可以參考下2022-01-01

