【问题标题】:how to enable TLSv1.3 in netty?如何在 netty 中启用 TLSv1.3?
【发布时间】:2019-04-23 16:39:28
【问题描述】:

因为满足https://netty.io/news/2018/10/30/4-1-31-Final.html 中提到的所有要求:

也就是说 TLSv1.3 默认情况下未启用,因此如果您想使用它,您需要在配置 SslContextBuilder 时使用 TLSv1.3 显式启用它(例如): SslContextBuilder.forClient().protocols("TLSv1.3") ....

但我遇到如下异常:

io.netty.handler.codec.DecoderException: javax.net.ssl.SSLHandshakeException: error:100000f0:SSL routines:OPENSSL_internal:UNSUPPORTED_PROTOCOL
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:472)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:278)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
        at com.taobao.hsf.io.netty.common.tls.NettyHandShakeHandler.channelRead0(NettyHandShakeHandler.java:80)
        at com.taobao.hsf.io.netty.common.tls.NettyHandShakeHandler.channelRead0(NettyHandShakeHandler.java:24)
        at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:648)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:583)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:500)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:454)
        at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897)
        at com.taobao.hsf.io.netty.util.PooledThreadFactory$PooledByteBufRunnable.run(PooledThreadFactory.java:37)
        at java.lang.Thread.run(Thread.java:745)
Caused by: javax.net.ssl.SSLHandshakeException: error:100000f0:SSL routines:OPENSSL_internal:UNSUPPORTED_PROTOCOL
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.sslReadErrorResult(ReferenceCountedOpenSslEngine.java:1194)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1155)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1226)
        at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1269)
        at io.netty.handler.ssl.SslHandler$SslEngineType$1.unwrap(SslHandler.java:216)
        at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1297)
        at io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1211)
        at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1245)
        at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:502)
        at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:441)
        ... 22 more

对此有何想法?

【问题讨论】:

    标签: netty tls1.3


    【解决方案1】:

    这是正确的方法,但在这种情况下,您只启用TLSv1.3,这意味着如果服务器仅支持例如TLSv1.2,握手将失败。通常您不仅希望支持 TLSv1.3,还希望支持另一种协议,例如 TLSV1.2

    SslContextBuilder.forClient().protocols("TLSv1.3", "TLSv.1.2"); 
    

    【讨论】:

    • 我试过这种方式,但是使用的是TLSv1.2,我也是这样配置服务器的SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey()).protocols("TLSv1.3", "TLSv1.2")
    • 我使用自签名证书,但是服务器仍然使用TLSv1.2。也许证书很重要。您能否提供项目中的 TLSv1.3 示例?
    • 您还需要确保在两个有效的站点上都设置了一些 TLSv1.3 密码套件。例如,您可以在我们的单元测试中看到它是如何工作的:github.com/netty/netty/blob/netty-4.1.31.Final/handler/src/test/…
    【解决方案2】:

    Netty 4.1.52-Final 版本默认支持 TLSv1.3,refer here 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 1970-01-01
      • 2020-06-23
      • 2019-08-27
      • 2020-06-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多