首页 > 解决方案 > Spring Webflux WebClient - 指定发送出站请求时使用的 TLS 版本(介于 TLSv1.2 和 TLSv1.3 之间)

问题描述

关于 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版本?请问如何解决这个问题?

谢谢

标签: javaspring-bootssl

解决方案


为此,您可以创建两个单独的 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 版本的网站测试了此配置。 这个答案提到了我用于测试的网站列表。


推荐阅读