Spring中的TLS设置

2023/05/17

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命令随默认的JDK发行版一起提供。让我们使用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)下定义的标准系列。

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/tuyucheng

由于我们没有指定https,它将输出一个错误:

Bad Request
This combination of host and port requires TLS.

这个问题可以通过使用https协议解决:

curl -v https://localhost:8443/tuyucheng

然而,这给了我们另一个错误:

curl: (60) SSL certificate problem: self signed certificate

当我们使用自签名证书时会发生这种情况。要解决此问题,我们必须在客户端请求中使用服务器证书。首先,我们将从服务器keystore文件中复制服务器证书tuyucheng.cer。然后我们将在curl请求中使用服务器证书以及–cacert选项:

curl --cacert tuyucheng.cer https://localhost:8443/tuyucheng

6. 总结

为了确保在客户端和服务器之间传输的数据的安全性,TLS可以单向或双向实现。在本文中,我们描述了如何在application.properties文件和Tomcat配置文件中的Spring Boot应用程序中配置TLS。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章