java - 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版本?请问如何解决这个问题?
谢谢
解决方案
为此,您可以创建两个单独的 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 版本的网站测试了此配置。 这个答案提到了我用于测试的网站列表。
推荐阅读
- c# - 在asp.net Web Api中使用facebook webhook进行leadgen时出现502 Bad gateway错误
- autodesk-forge - Forge MArkups Freehand 的字体大小和粗细
- php - 如何在 WP 中使用 functions.hp 设置 AMP 元描述
- c# - Json 将对象添加到空字段
- html - Wordpress 中的横幅新闻是分开的?
- python - 在 tkinter.listbox 对象/选项中存储数据的优雅方式
- python - Wikipedia Extractor - 去除文本中的标题
- reactjs - 由于 JWT 令牌过期错误,如何重试 Uppy(使用 XHR 插件)请求失败
- android - 镜像(前置)摄像头是否会影响带有 CameraX 的 MLKit?
- ios - 如果我在苹果 m1 上使用 react native 开发 iOS 应用程序,构建是否兼容不使用 ARM 芯片的设备?