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. 設置 SSL 在 Spring Boot 中的方法
在 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. 配置密鑰存儲和信任存儲的詳細信息
要配置密鑰存儲,即包含服務器的證書和私鑰,我們可以使用以下屬性: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 支持無縫集成,確保安全通信和身份驗證。
統一 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 協議並處理諸如雙向身份驗證之類的複雜場景。