Spring 框架中的統一 SSL 支援
1.簡介
在本教學中,我們將探討 SSL、它在安全通訊中的重要性,以及 Spring Framework 的統一 SSL 支援如何簡化 Spring Boot、Spring Security 和 Spring Web 等模組之間的設定。
SSL(安全通訊端層)是一種標準安全協議,它在網路伺服器和瀏覽器之間建立加密鏈接,確保傳輸的資料保持私密和安全。這對於保護敏感資訊和建立 Web 應用程式的信任至關重要。
2.統一 SSL 支援有哪些新功能?
Spring Boot 3.1引進了SslBundle
,一個用於定義和管理 SSL 配置的集中元件。 SslBundle
將 SSL 相關設定(包括金鑰庫、信任庫、憑證和私鑰)整合到可重複使用的套件中,可以輕鬆應用於各種 Spring 元件。
主要亮點包括:
- 集中配置: SSL 屬性現在在
spring.ssl.bundle
前綴下進行管理,為 SSL 設定提供單一真實來源 - 簡化管理:該框架提供明確的預設值、更好的文件以及處理複雜用例(如相互 SSL 認證或微調密碼套件)的擴展支持
- 改進的安全實踐:開箱即用的功能確保遵守現代安全標準,例如配置、支援 Java KeyStore (JKS)、PKCS12 和 PEM 編碼證書,並提供簡單的 HTTPS 實作配置
- 重新載入功能:當金鑰材質發生變化時,SSL 套件可以自動重新載入,確保更新期間的停機時間最短
統一的 SSL 支援與各種 Spring 模組相容,包括 Web 伺服器(Tomcat、Netty)、REST 用戶端和資料存取技術。這確保了整個 Spring 生態系統的一致 SSL 體驗。
3.在 Spring Boot 中設定 SSL
在 Spring Boot 中設定 SSL 非常簡單且有統一的支援。
3.1.使用屬性啟用 SSL
要啟用 SSL,我們首先需要設定application.properties
或application.yml
:
server:
ssl:
enabled: true
key-store: classpath:keystore.p12
key-store-password: password
key-store-type: PKCS12
這將啟用 SSL 並指定包含我們的 SSL 憑證的金鑰庫的位置、密碼和類型。
3.2.配置密鑰庫和信任庫詳細信息
要設定包含我們伺服器的憑證和私鑰的 keystone,我們可以使用下列屬性:
spring:
ssl:
bundle:
jks:
mybundle:
keystore:
location: classpath:application.p12
password: secret
type: PKCS12
對於包含受信任伺服器憑證的信任庫,我們需要新增以下屬性:
spring:
ssl:
bundle:
jks:
mybundle:
truststore:
location: classpath:application.p12
password: secret
3.3.設定自簽名和 CA 簽名證書
自簽名證書對於測試或內部用途很有用。我們可以使用keytool
指令產生一個:
$ keytool -genkeypair -alias myalias -keyalg RSA -keystore keystore.p12 -storetype PKCS12 -storepass password
對於生產環境,建議使用 CA 簽署的憑證。為了確保增強的安全性和可信度,我們可以從憑證授權單位 (CA) 取得此資訊並將其新增至我們的金鑰庫或信任庫。
4. Spring Security 和 SSL
Spring Security 與統一的 SSL 支援無縫集成,確保安全的通訊和身份驗證。
Unified SSL 透過與 Spring Security 無縫整合簡化了安全認證。開發人員可以使用SslBundles
為客戶端和伺服器互動建立安全連線。我們可以在我們的應用程式中進一步強制執行 HTTPS。
讓我們使用以下配置來強制執行 HTTPS:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requiresChannel()
.anyRequest()
.requiresSecure();
}
}
然後,為了增強安全性,我們應該啟用 HTTP 嚴格傳輸安全性 (HSTS):
http.headers()
.httpStrictTransportSecurity()
.includeSubDomains(true)
.maxAgeInSeconds(31536000); // 1 year
此策略可確保瀏覽器僅透過 HTTPS 與我們的應用程式通訊。
5.自訂 SSL 配置
透過微調 SSL 設置,開發人員可以增強安全性、優化效能並滿足獨特的應用程式需求。
5.1.微調 SSL 協定和密碼套件
Spring 允許我們自訂支援的 SSL 協定和密碼套件以增強安全性:
server:
ssl:
enabled-protocols: TLSv1.3,TLSv1.2
ciphers: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
5.2.使用程式配置進行進階用例
對於進階場景,可能需要進行程式配置:
HttpServer server = HttpServer.create()
.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
這種方法提供了對 SSL 設定的精細控制,特別是對於動態環境。
5.3.處理特定場景
我們還可以透過使用統一的 SSL 支援來處理特定場景。例如,啟用相互 SSL 身份驗證:
server:
ssl:
client-auth: need
此設定可確保伺服器在 SSL 握手期間需要有效的用戶端憑證。
6.結論
在本文中,我們探討了 Spring Boot 3.1 的統一 SSL 支持,這使得跨 Spring 應用程式設定 SSL 變得容易。新的SslBundle
集中了 SSL 設置,允許開發人員在一個地方管理憑證、金鑰庫和信任庫。它簡化了安全通信,與 Spring Security 無縫集成,並有助於實施 HTTPS。
配置過程非常用戶友好,具有啟用 SSL、設定密鑰庫和自訂安全功能的清晰選項。開發人員可以輕鬆微調 SSL 協定並處理相互認證等高階場景。
本文提供的程式碼可在 GitHub 上找到。