[英]Spring Webflux WebClient - Specify the TLS version (between TLSv1.2 and TLSv1.3) used when sending outbound request
关于来自 Spring Webflux 的 Spring WebClient 的小问题,以及在发送出站 http 请求时如何配置 TLS 版本(我是客户端)。
在 SpringBoot MVC 项目(不是 Webflux)中,我使用的是 Webflux Webclient(可以将两者混合使用)。
我正在使用客户端调用两个外部方 HTTP 服务器,我完全无法控制。 第一个服务是 AliceService。 Alice 服务配置为仅接受 TLSv1.2 的请求
第二个服务是 BobService。 Bob 服务配置为仅接受 TLSV1.3 的请求
因此,我目前面临一个问题。 我永远无法同时给他们两个打电话。
我尝试了不同的组合
-Djdk.tls.client.protocols=TLSv1.2
-Djdk.tls.client.protocols=TLSv1.3
server.ssl.enabled-protocols=TLSv1.2
server.ssl.enabled-protocols=TLSv1.3
每次,我要么将所有出站请求更改为 TLSv1.2(因此仅接受 TLSv1.3 的服务将失败),要么将我所有的出站调用更改为 TLSv1.3(因此仅接受 TLSv1.2 的服务将失败)。
我什至有两个不同的 WebClient 实例。
请问发送出站请求时如何配置使用哪个TLS版本? 请问如何解决这个问题?
谢谢
为此,您可以创建两个单独的 web 客户端。 一个用于 TLSv1.2,一个用于 TLSv1.3。
这是您可以用来构建 WebClient 以及您需要的其他配置的最小代码片段。
用于 TLSv1.2 的 WebClient
final SslContext sslContextForTls12 = SslContextBuilder.forClient()
.protocols("TLSv1.2")
.build();
final HttpClient httpClientForTls12 = HttpClient.create()
.secure(ssl -> ssl.sslContext(sslContextForTls12));
final WebClient webClientForTls12 = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClientForTls12))
.build();
用于 TLSv1.3 的 WebClient
final SslContext sslContextForTls13 = SslContextBuilder.forClient()
.protocols("TLSv1.3")
.build();
final HttpClient httpClientForTls13 = HttpClient.create()
.secure(ssl -> ssl.sslContext(sslContextForTls13));
final WebClient webClientForTls13 = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClientForTls13))
.build();
我已经为支持各种 TLS 版本的网站测试了此配置。 这个答案提到了我用于测试的网站列表。
这不应该是硬编码/配置的,而是在 TLS 握手期间根据服务器和客户端的能力自动协商的,否则它会成为维护的噩梦。 您无需担心降级攻击,因为 TLS 有一种保护机制来检测它。
您应该能够通过以下方式看到这一点: -Djavax.net.debug=all
或类似的。 请参阅JSSE 参考指南,调试实用程序
如果您想避免某些旧版本的 TLS,正确的解决方案是将不安全的旧密码列入黑名单(由于安全性/合规性),这可以通过更改配置文件中的jdk.tls.disabledAlgorithms
来完成: jre/lib/security/java.security
,在最新的 Java 安装中包含相当安全的默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.