Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Webflux WebClient-指定发送出站请求时使用的TLS版本(介于TLSv1.2和TLSv1.3之间)_Java_Spring Boot_Ssl - Fatal编程技术网

Java Spring Webflux WebClient-指定发送出站请求时使用的TLS版本(介于TLSv1.2和TLSv1.3之间)

Java Spring Webflux WebClient-指定发送出站请求时使用的TLS版本(介于TLSv1.2和TLSv1.3之间),java,spring-boot,ssl,Java,Spring Boot,Ssl,关于SpringWebFlux中SpringWebClient的小问题,以及在发送出站http请求时如何配置TLS版本(我是客户端) 在SpringBoot MVC项目(不是Webflux)中,我使用的是Webflux Webclient(可以将两者混合使用) 我使用客户端调用两个外部方HTTP服务器,我完全无法控制它们。 第一个服务是AliceService。Alice服务配置为仅接受TLSv1.2中的请求 第二种服务是BobService。Bob服务配置为仅接受TLSV1.3中的请求 因此,

关于SpringWebFlux中SpringWebClient的小问题,以及在发送出站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的网络客户端

    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的网络客户端

    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
或类似方式。见


如果您想避免TLS的某些旧版本,正确的解决方案是将不安全的旧密码列入黑名单(由于安全性/合规性),这可以通过更改配置文件中的
jdk.TLS.disabledAlgorithms
来实现:
jre/lib/security/java.security
,在最新的Java安装中,它包含相当安全的默认值。

工作正常,非常感谢