如何在Spring-boot上启用TLS 1.2?

27
我正在尝试在Spring Boot 1.2.1上的Tomcat上启用TLS 1.2。由于SSL握手失败,Android 5.0无法连接默认的SSL设置。Android 4.4、iOS、Firefox和Chrome都可以连接到默认版本。我认为这是因为Android 5.0支持的TLS协议与Spring Boot Tomcat默认设置(TLS v1?)不匹配。
我想我需要更改此application.properties设置:
server.ssl.protocol=TLS

但我没有找到其他可接受的字符串(或者说是否有任何其他的,甚至都不确定)。在spring boot github上搜索“protocol”,我没有发现任何枚举。

我尝试使用“TLSv1.2”,但似乎没有效果。

application.properties中当前的SSL配置为:

server.ssl.key-store = chainedcertificates.p12
server.ssl.key-store-password = secret
server.ssl.key-store-type = PKCS12

如何在Spring Boot中启用TLS 1.2?

如果有影响的话,我使用的是Java 1.7。文档似乎表明它应该支持TLS 1.2。

Tomcat 8似乎已经支持了。 我不确定如何检查Spring Boot中运行的确切版本。


1
引导程序将 server.ssl.protocol 设置传递给 Tomcat(https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java#L266),因此由 Tomcat 而不是 Boot 确定可接受的值。据我所知,TLSv1.2 是您需要的值。 - Andy Wilkinson
2个回答

28

由于Spring Boot包含的默认密码,您可能会遇到SSL握手错误。建议您定义一组密码。我们遇到了类似的问题,并且解决方法是在调用方使用SSLScan,然后扫描我们的系统以查看是否有任何匹配项。这使我们发现没有匹配项,并帮助我们定义了应支持的密码列表。

使用SSLScan,以下是Spring Boot将使用的默认密码:

Preferred TLSv1.2  128 bits  ECDHE-RSA-AES128-GCM-SHA256   Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA256       Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  ECDHE-RSA-AES128-SHA          Curve P-256 DHE 256
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-GCM-SHA256     DHE 1024 bits
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-SHA256         DHE 1024 bits
Accepted  TLSv1.2  128 bits  DHE-RSA-AES128-SHA            DHE 1024 bits
为了启用 TLS 1.2 并定义密码列表,请执行以下操作:

To enable TLS 1.2 and to define the cipher list please do the following:

#enable/diable https
server.ssl.enabled=true

#ssl ciphers
server.ssl.ciphers=TLS_RSA_WITH_AES_128_CBC_SHA256, INCLUDE_ANY_OTHER_ONES_YOU_NEED_TO_SUPPORT

# SSL protocol to use.
server.ssl.protocol=TLS

# Enabled SSL protocols.
server.ssl.enabled-protocols=TLSv1.2

如果您需要使用密码列表,请访问https://testssl.sh/openssl-rfc.mapping.htmlhttps://msdn.microsoft.com/en-us/library/windows/desktop/mt813794(v=vs.85).aspx


你在哪里找到所有的属性名称的?有没有相关的Spring文档? - magulla
2
@magulla,是的,你可以在这里找到它。https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html - Dot Batch
@DotBatch,我能把server.ssl.ciphers设置多行吗? - Artanis Zeratul
1
感谢 @DotBatch 给我提供这个线索。通过结合您的设置并使用此处建议的加密方式进行调整,我在 https://www.ssllabs.com/ssltest/ 中获得了 A 级别的评分,只使用了基于 256 的算法。同时参考这里的内容:https://weakdh.org/sysadmin.html。 - Artanis Zeratul
不确定您是否可以使用“server.ssl.protocol”属性来配置Tomcat。似乎“org.apache.tomcat.util.net.SSLHostConfig”具有一组默认协议,而Spring不提供修改这些默认值的方法。我在自己尝试拒绝除TLSv1.2以外的任何内容时发现了这一点。 - Norbert
显示剩余5条评论

17

在spring-boot 1.2.1中,默认启用了TLS 1.2。可以通过从命令行运行以下命令来验证:

openssl s_client -connect serverAddress:port

输出

SSL-Session:
Protocol  : TLSv1.2
Cipher    : ECDHE-RSA-AES256-SHA384

所以我的问题肯定是另外的事情。


我们遇到了类似的问题,即Android客户端无法连接嵌入式Tomcat启用SSL的Spring Boot 1.4.1服务器。 我们无法确定根本原因,但我们怀疑是与SSL协议不匹配,就像您所提到的那样。 您能解决这个问题并分享您的方法吗?谢谢。 - baraka
@baraka 我的问题根源是 Android 实现中的一个 bug。请参见 https://dev59.com/sofca4cB1Zd3GeqPdAP6。这个 bug 被 Tyrus 参考 websocket 触发,但不会被其他实现如 AndroidAsync 或 nv-websocket 触发。不确定这是否与你的特定情况相关。 - mattm
我也遇到了同样的问题...你们解决了吗? - mor222
@mor222 请查看我的回答。你可能也因为密码不匹配而遇到了问题。我还包括了如何启用TLS 1.2的方法。 - Dot Batch
@DotBatch 感谢您的答复。实际上我在我的服务器上找到了问题。这正是密码不匹配的问题。 - mor222
我遇到了浏览器问题。密码套件不匹配。 - learner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接