1. 介紹
在本教程中,我們將探討 SSL,它在安全通信中的重要性,以及 Spring 框架統一的 SSL 支持如何簡化模塊(如 Spring Boot、Spring Security 和 Spring Web)之間的配置。
SSL(安全套接層)是一種標準安全協議,它在 Web 服務器和瀏覽器之間建立加密鏈接,確保傳輸的數據保持私密和安全。它對於保護敏感信息和建立 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. 配置 Keystore 和 Truststore 詳細信息
為了配置 Keystore,該 Keystore 包含我們服務器的證書和私鑰,可以使用以下屬性:
spring:
ssl:
bundle:
jks:
mybundle:
keystore:
location: classpath:application.p12
password: secret
type: PKCS12對於一個信任存儲(truststore),它包含對受信任服務器的證書,我們需要添加以下屬性:
spring:
ssl:
bundle:
jks:
mybundle:
truststore:
location: classpath:application.p12
password: secret3.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 支持無縫集成,確保安全通信和身份驗證。
統一 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_SHA2565.2. 使用程序化配置進行高級用例
對於高級場景,可能需要使用程序化配置:
HttpServer server = HttpServer.create()
.secure(sslContextSpec -> sslContextSpec.sslContext(sslContext));
這種方法提供了對 SSL 設置的精細控制,尤其適用於動態環境。
5.3. 處理特定場景
我們可以通過使用統一 SSL 支持來處理特定場景。例如,啓用雙向 SSL 身份驗證:
// 雙向 SSL 身份驗證允許客户端和服務器之間進行驗證,
// 從而提高安全性。
server:
ssl:
client-auth: need此設置確保服務器在 SSL 手動過程中需要有效的客户端證書。
6. 結論
在本文中,我們探討了 Spring Boot 3.1 的統一 SSL 支持,這使得在 Spring 應用中輕鬆配置 SSL。新的 <em >SslBundle</em> 集中管理 SSL 設置,允許開發者在一個地方管理證書、密鑰存儲和信任存儲。它簡化了安全通信,與 Spring Security 無縫集成,並有助於強制執行 HTTPS。
配置過程簡單易用,提供了啓用 SSL、設置密鑰存儲和自定義安全功能等清晰選項。開發者可以輕鬆調整 SSL 協議並處理諸如雙向身份驗證等高級場景。