SSL 异常标记不匹配错误,带有 spring webflux webclient 请求

问题描述 投票:0回答:1

我刚刚将一个服务转换为 webflux/netty 堆栈(以前是 mvc/undertow) 该服务使用 spring webclient(以前的 okHttp 客户端)向下游服务发出 https 请求。 该服务是使用 JDK 17 构建的(并在 JVM 18 上运行) 在生产环境中,我们遇到 SSL 错误在一段时间(15 分钟或最多 120 分钟)后开始,并且随着时间的推移而增加。如果服务重新启动,错误就会消失,直到稍后再次启动。

我得到的异常:

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLException: Tag mismatch
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:480)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:279)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
    at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:800)
    at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1.run(AbstractEpollChannel.java:425)
    at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:391)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: javax.net.ssl.SSLException: Tag mismatch
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:133)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:371)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314)
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:309)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:123)
    at java.base/sun.security.ssl.SSLEngineImpl.decode(SSLEngineImpl.java:736)
    at java.base/sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:691)
    at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:506)
    at java.base/sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:482)
    at java.base/javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:679)
    at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:295)
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1342)
    at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1235)
    at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1284)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:510)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:449)
    ... 18 common frames omitted
Caused by: javax.crypto.AEADBadTagException: Tag mismatch
    at java.base/com.sun.crypto.provider.GaloisCounterMode$GCMDecrypt.doFinal(GaloisCounterMode.java:1591)
    at java.base/com.sun.crypto.provider.GaloisCounterMode.engineDoFinal(GaloisCounterMode.java:454)
    at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2501)
    at java.base/sun.security.ssl.SSLCipher$T12GcmReadCipherGenerator$GcmReadCipher.decrypt(SSLCipher.java:1659)
    at java.base/sun.security.ssl.SSLEngineInputRecord.decodeInputRecord(SSLEngineInputRecord.java:239)
    at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:196)
    at java.base/sun.security.ssl.SSLEngineInputRecord.decode(SSLEngineInputRecord.java:159)
    at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
    ... 29 common frames omitted

Web客户端配置代码:

 @Bean
    public WebClient webClient(MetricsWebClientCustomizer metricsCustomizer,
                               WebClient.Builder builder,
                               @Value("${s2s.client.read-timeout-ms}") int readTimeoutMs) throws SSLException {
        metricsCustomizer.customize(builder);
        HttpClient httpClient = createNettyHttpClient(readTimeoutMs);
        WebClient webClient = builder
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .build();

        // warming up web client to allow smooth first requests
        httpClient.warmup().subscribe((ignored) -> log.info("web client initialized"));

        return webClient;
    }

    private HttpClient createNettyHttpClient(int readTimeoutMs) throws SSLException {
        final ConnectionProvider connectionProvider = ConnectionProvider
            .builder("webclient-connection-provider")
            .maxIdleTime(Duration.ofSeconds(poolConnectionMaxIdleTimeSeconds))
            .maxConnections(maxConnections)
            .pendingAcquireMaxCount(pendingAcquireMaxCount)
            .build();

        return HttpClient.create(connectionProvider)
            .doOnConnected(
                c -> c.addHandlerLast(new ReadTimeoutHandler(readTimeoutMs))
                    .addHandlerLast(new WriteTimeoutHandler(readTimeoutMs)))
            .option(CONNECT_TIMEOUT_MILLIS, readTimeoutMs)
            .compress(true)
            .runOn(LoopResources.create("eventloop-webclient", nettyWorkerThreadsCount, true));
    }
spring spring-webflux reactor-netty
1个回答
0
投票

这个问题可能与jdk的bug有关。 参考:

https://github.com/corretto/corretto-8/issues/424
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8293973
https://bugs.openjdk.org/browse/JDK-8277970
© www.soinside.com 2019 - 2024. All rights reserved.