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。
0 评论