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

Posted

技术标签:

【中文标题】如何在 Spring-boot 上启用 TLS 1.2?【英文标题】:How do you enable TLS 1.2 on Spring-boot? 【发布时间】:2015-03-15 08:34:41 【问题描述】:

我正在尝试在 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 中搜索“协议”,我找不到任何枚举。 我试过“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 seems to have support present.我不确定如何准确检查 Spring Boot 中运行的是哪个版本。

【问题讨论】:

Boot 将 server.ssl.protocol 设置传递给 Tomcat (github.com/spring-projects/spring-boot/blob/master/spring-boot/…),因此确定可接受值的是 Tomcat,而不是 Boot。 AFAIK,TLSv1.2 是您需要的值。 【参考方案1】:

在 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 客户端无法将我们的 Spring Boot 1.4.1 服务器连接到由嵌入式 tomcat 提供支持的服务器与 ssl。我们未能确定根本原因,但我们确实怀疑它与您提到的 ssl 协议不匹配。你能解决这个问题并分享你的路径吗?谢谢 @baraka 我的问题的根源是 Android 实现中的一个错误。见***.com/questions/28011581/…。此错误是由 Tyrus 参考 websocket 触发的,但不是由 AndroidAsync 或 nv-websocket 等其他实现触发的。不确定这是否与您的特定情况有关。 我也遇到了同样的问题……你们解决了吗? @mor222 看到我的回答。由于密码不匹配,您也可能遇到问题。我还包括如何启用 tls 1.2 @DotBatch 感谢您的回答。我实际上在我的服务器上发现了问题。这正是密码不匹配的问题。【参考方案2】:

由于 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 并定义密码列表,请执行以下操作:

#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.html 和 https://msdn.microsoft.com/en-us/library/windows/desktop/mt813794(v=vs.85).aspx

【讨论】:

您在哪里找到所有属性名称?有春季文档吗? @magulla 是的,你可以在这里找到它。 docs.spring.io/spring-boot/docs/current/reference/html/… @DotBatch,我可以让 server.ssl.ciphers 多行吗? @ArtanisZeratul 如果你使用 YAML,你可以。 ***.com/a/3790497/2939985 不允许重复的属性键。 感谢@DotBatch 给我这个线索。这有助于在 ssllabs.com/ssltest 中获得 A 标记,方法是在此处组合您的设置并使用此处推荐的内容调整密码:weakdh.org/sysadmin.html,并且仅使用基于 256 的算法。

以上是关于如何在 Spring-boot 上启用 TLS 1.2?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nginx 中启用 TLS 1.2?

如何在 IIS7 Windows Server 2008 R2 上启用 TLS1.2

如何在 Picasso 上启用 TLS v 1.2 以在 Kotlin 中使用 https 加载图像

如何在Android应用程序中启用TLS 1.2支持(在Android 4.1 JB上运行)

.NET 4.5.1 中的 WCF 客户端:使用 WebRequest 时如何启用 TLS 1.2?

在 IIS 10 windows server 2019 上启用 TLS 1.3