如何在SpringBoot中设置TLS? |Baeldung


安全通信在现代应用程序中起着重要作用。客户端和服务器之间通过纯HTTP进行的通信不安全。对于可用于生产的应用程序,我们应在应用程序中通过TLS(传输层安全性)协议启用HTTPS。在本教程中,我们将讨论如何在Spring Boot应用程序中启用TLS技术。
 
1.生成密钥对
要启用TLS,我们需要创建一个公共/私有密钥对。为此,我们使用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

密钥库文件可以在不同的格式。两种最受欢迎​​的格式是Java KeyStore(JKS)和PKCS#12。JKS特定于Java,而PKCS#12是一种行业标准格式,属于在公共密钥密码术标准(PKCS)下定义的一系列标准。
 
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.在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

trust-store指向的位置路径是一个文件,该文件包含计算机为SSL服务器身份验证所信任的证书颁发机构的列表。需要trust-store-password才能访问的密码信任文件。
 
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
curl -v http://localhost:8443/baeldung
由于我们未指定https,因此将输出错误.通过使用https协议可以解决此问题:
curl -v https://localhost:8443/baeldung
但是,这给了我们另一个错误:
SSL certificate problem: self signed certificate
当我们使用自签名证书时,会发生这种情况。要解决此问题,我们必须在客户端请求中使用服务器证书。首先,我们将从服务器密钥库文件中复制服务器证书baeldung.cer。然后,我们将在curl请求中使用服务器证书以及–cacert选项:
curl --cacert baeldung.cer https://localhost:8443/baeldung