当前位置: 首页 > 知识库问答 >
问题:

通过TLSv1.2的WebClient

夏谦
2023-03-14

关于Spring WebFlow WebClient的小问题,尤其是如何配置一个使用TLSv1.2发送出站请求的问题。

我的应用程序是Spring WebFlow 2.4.2,其中启用了HTTP/2、SSL、mTLS和TLSv1.3。

server.ssl.enabled-protocols=TLSv1.3
server.http2.enabled=true
server.ssl.client-auth=need
server.ssl.enabled=true
server.ssl.key-alias=alias
server.ssl.key-password=
server.ssl.key-store-password=
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS
server.ssl.key-store=/keystore.p12
server.ssl.trust-store-password=
server.ssl.trust-store-provider=SUN
server.ssl.trust-store-type=JKS
server.ssl.trust-store=/truststore.p12

注意它是TLSv1。3,而不是设置上的TLSv1,2。

创建WebClient实例时:

getWebClient().mutate().baseUrl("https://some-server.com").build().post().uri("/some/route").retrieve().bodyToMono(String.class);

 @Bean
    @Primary
    public WebClient getWebClient() {
        return WebClient.create().mutate().defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE, HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE).clientConnector(new ReactorClientHttpConnector(HttpClient.create().secure(sslContextSpec -> sslContextSpec.sslContext(getSslContextBuilder())))).build();
    }


    public SslContextBuilder getSslContextBuilder() {
        try {
            final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
            try (InputStream file = new FileInputStream(keyStorePath)) {
                final KeyStore keyStore = KeyStore.getInstance(keyStoreType);
                keyStore.load(file, keyStorePassPhrase.toCharArray());
                keyManagerFactory.init(keyStore, keyPassPhrase.toCharArray());
            }

            final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            try (InputStream trustStoreFile = new FileInputStream(trustStorePath)) {
                final KeyStore trustStore = KeyStore.getInstance(trustStoreType);
                trustStore.load(trustStoreFile, trustStorePassPhrase.toCharArray());
                trustManagerFactory.init(trustStore);
            }

            final ApplicationProtocolConfig applicationProtocolConfig = new ApplicationProtocolConfig(ApplicationProtocolConfig.Protocol.ALPN, ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE, ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT, ApplicationProtocolNames.HTTP_2, ApplicationProtocolNames.HTTP_1_1);
            return SslContextBuilder.forClient().applicationProtocolConfig(applicationProtocolConfig).keyManager(keyManagerFactory).trustManager(InsecureTrustManagerFactory.INSTANCE);
        } catch (CertificateException | NoSuchAlgorithmException | IOException | KeyStoreException | UnrecoverableKeyException e) {
            return null;
        }
    }

并使用它向TLSv1发送请求。3启用服务器,工作正常,非常开心。

但是,我需要与之交互的一些服务器要么有旧的/不同的JDK版本,要么启用了TLSv1.2(我不拥有这些第三方API)。

因为我得到了:

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: extension (5) should not be presented in certificate_request

在SO进行研究后,我发现我可以配置这样的。

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {
        System.setProperty("jdk.tls.client.protocols", "TLSv1.2");
        SpringApplication.run(MyApplication.class);
    }

令人惊讶的是,这个问题是固定的(不知道为什么)。

我的问题是:与其设置系统属性,我是否可以简单地在代码级别上使用WebClient实现相同的功能?

谢谢你

共有1个答案

陶成济
2023-03-14

从今天起,系统。setProperty(“jdk.tls.client.protocols”、“TLSv1.2”) 是解决方案

 类似资料:
  • 请耐心等待,因为我可能对创建证书以实现TLS连接缺乏一些理解。 我试图建立一个连接与TLSv1.2加密从客户端到服务器。我已经在客户端创建了自己的CA证书和CSR,并开始签署客户端。 在生成CSR并使用CA证书签名后,在客户端: client-cert.pem 客户企业社会责任。pem 客户端密钥。质子交换膜 使用的命令: openssl req节点-newkey rsa: 4096-keyout

  • 为了解决这个问题,我已经用尽了我的能力来研究和实验。我尝试过信任管理器、ssl套接字工厂、主机名验证器、方案注册表、ssl上下文修改等。

  • 5.4 通过 HTTPS 的通信 大多数智能手机应用都与互联网上的 Web 服务器通信。 作为通信的方法,我们在这里集中讨论 HTTP 和 HTTPS 的两种方法。 从安全角度来看,HTTPS 通信更为可取。 最近,Google 或 Facebook 等主要 Web 服务已经开始使用 HTTPS 作为默认设置。 自 2012 年以来,Android 应用中 HTTPS 通信实现的许多缺陷已被指出。

  • 服务器上的LWP是5.834。 我知道理想的方法是CentOS 6或更高的版本,但有没有更好的方法来让它发挥作用?

  • 目前我使用的是Java7,我无法连接到LDAPS。我尝试了下面的代码,但仍然无法连接: 2018-04-10 15:21:23,446 INFO[stdout](EJB default-1)EJB default-1,write:TLSV1.2握手,长度=221 2018-04-10 15:21:23,446 INFO[stdout](EJB default-1)EJB default-1,rea

  • 问题内容: 是否可以通过react-router中的组件传递对象? 就像是: 与我从to 组件传递过来的方式相同。 如果不可能的话,最好的方法是什么: 我有一个React + Flux应用程序,并且用一些数据渲染了表格。我想做的是,当我单击其中一行时,它将带我到该行的一些 详细信息 组件。该行包含了我需要的所有数据,所以我认为如果可以将其传递通过,那将是很好的。 另一种选择是在url中传递行的,在