如何在Spring Boot應用程序中啟用TLS技術
- Spring
- Https
1.概述
安全通信在現代應用程序中起著重要作用。客戶端和服務器之間通過純HTTP進行的通信不安全。對於可用於生產的應用程序,我們應在應用程序中通過TLS(傳輸層安全性)協議啟用HTTPS。在本教程中,我們將討論如何在Spring Boot應用程序中啟用TLS技術。
2. TLS協議
TLS為客戶端和服務器之間傳輸的數據提供保護,並且是HTTPS協議的關鍵組成部分。安全套接字層(SSL)和TLS通常可以互換使用,但是它們並不相同。實際上,TLS是SSL的後繼產品。 TLS可以單向或雙向實現。
2.1 單向TLS
在單向TLS中,只有客戶端才能驗證服務器,以確保它從受信任的服務器接收數據。為了實現單向TLS,服務器與客戶端共享其公共證書。
2.2 雙向TLS
在雙向TLS或相互TLS(mTLS)中,客戶端和服務器都相互進行身份驗證,以確保通信中涉及的雙方都是受信任的。為了實施mTLS,雙方要相互共享其公共證書。
3.在Spring Boot中配置TLS
3.1 生成密鑰對
要啟用TLS,我們需要創建一個公鑰/私鑰對。為此,我們使用keytool
。 keytool
命令隨附於默認的Java發行版。讓我們使用keytool
生成密鑰對並將其存儲在keystore.p12
文件中:
keytool -genkeypair -alias baeldung -keyalg RSA -keysize 4096 \
-validity 3650 -dname "CN=localhost" -keypass changeit -keystore keystore.p12 \
-storeType PKCS12 -storepass changeit
keystore
文件可以採用不同的格式。兩種最受歡迎的格式是Java KeyStore(JKS)和PKCS#12。 JKS特定於Java,而PKCS#12是一種行業標準格式,屬於在公共密鑰密碼術標準(PKCS)下定義的一系列標準。
3.2 在Spring中配置TLS
讓我們從配置單向TLS開始。 application.properties
文件中配置與TLS相關的屬性:
# enable/disable https
server.ssl.enabled=true
# keystore format
server.ssl.key-store-type=PKCS12
# keystore location
server.ssl.key-store=classpath:keystore/keystore.p12
# keystore password
server.ssl.key-store-password=changeit
在配置SSL協議時,我們將使用TLS,並告訴服務器使用TLS 1.2:
# SSL protocol to use
server.ssl.protocol=TLS
# Enabled SSL protocols
server.ssl.enabled-protocols=TLSv1.2
為了驗證一切正常,我們只需要運行Spring Boot應用程序即可:
3.3 在Spring中配置mTLS
為了啟用mTLS,我們將client-auth
屬性與need
值一起使用:
server.ssl.client-auth=need
當我們使用need
值時,客戶端身份驗證是必需的,也是強制性的。這意味著客戶端和服務器都必須共享其公共證書。為了將客戶端的證書存儲在Spring Boot應用程序中,我們使用truststore
文件並在application.properties
文件中對其進行配置:
#trust store location
server.ssl.trust-store=classpath:keystore/truststore.p12
#trust store password
server.ssl.trust-store-password=changeit
truststore
位置的路徑是一個文件,該文件包含計算機為SSL服務器身份驗證所信任的證書頒發機構的列表。 truststore
密碼是用於訪問truststore
文件的密碼。
4.在Tomcat中配置TLS
默認情況下,啟動Tomcat時將使用沒有任何TLS功能的HTTP協議。為了在Tomcat中啟用TLS,我們配置server.xml
文件:
<Connector
protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
clientAuth="false" sslProtocol="TLS" sslEnabledProtocols="TLSv1.2"/>
為了啟用mTLS,我們將設置clientAuth=”true”
。
5.調用HTTPS API
為了調用REST API,我們將使用curl
工具:
curl -v http://localhost:8443/baeldung
由於我們未指定https
,因此將輸出錯誤:
Bad Request
This combination of host and port requires TLS.
https
協議可以解決此問題:
curl -v https://localhost:8443/baeldung
但是,這給了我們另一個錯誤:
SSL certificate problem: self signed certificate
當我們使用自簽名證書時,會發生這種情況。要解決此問題,我們必須在客戶端請求中使用服務器證書。首先,我們將從服務器keystore
文件中baeldung.cer
然後,我們將在curl
請求中–cacert
選項:
curl --cacert baeldung.cer https://localhost:8443/baeldung
六,結論
為了確保在客戶端和服務器之間傳輸的數據的安全性,可以單向或雙向實現TLS。 application.properties
文件和Tomcat配置文件中描述如何在Spring Boot應用程序中配置TLS。