Netty 设置 SSL 握手超时不起作用

Posted

技术标签:

【中文标题】Netty 设置 SSL 握手超时不起作用【英文标题】:Netty set SSL handshake timeout does not work 【发布时间】:2018-02-28 23:10:43 【问题描述】:

行为

我使用的是 Netty 4.1.15.Final。我想在服务器端启用 setHandshakeTimeout() 。我这样调用setHandshakeTimeout()方法sslHandler.setHandshakeTimeout(1,TimeUnit.MILLISECONDS); HandshakeTimeout的值设置为一个很小的值,这样客户端和服务器就无法完成握手,因为握手超时了。

但是我在服务器上使用它就不行了。服务器和客户端之间仍然可以建立连接。但是,当我在客户端执行相同操作时,无法建立 SSL 连接,这是我希望看到的。

重现步骤

    在服务器中调用sslHandler.setHandshakeTimeoutMillis(1);sslHandler.setHandshakeTimeout(1,TimeUnit.MILLISECONDS); 进行连接,即可成功建立 SSL 连接 在客户端再次执行1和2,无法建立SSL连接

我的代码是这样的

 @Override
public void initChannel(SocketChannel ch) throws Exception 
    ChannelPipeline pipeline = ch.pipeline();

    // I want to set the SSL handshake timeout
    SslHandler sslHandler = sslCtx.newHandler(ch.alloc());
    sslHandler.setHandshakeTimeoutMillis(1);
    sslHandler.setHandshakeTimeout(1,TimeUnit.NANOSECONDS);

    pipeline.addLast(sslHandler);

    // On top of the SSL handler, add the text line codec.
    pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
    pipeline.addLast(new StringDecoder());
    pipeline.addLast(new StringEncoder());

    // and then business logic.
    pipeline.addLast(new SecureChatServerHandler());

我以official SecureChat 为例

问题

我做错了吗?如果是,如何正确设置服务器的 SSL 握手超时?如果不能,为什么SSL连接可以建立,握手超时无效?

【问题讨论】:

您确定 1 纳秒足以完成所有费用计算以准备和验证对方吗?即使是从 ram 进行简单的读取操作也需要 120 纳秒 我在毫秒或秒内尝试了不同的值,如 100,200,500 等,连接仍然可以建立,我很好奇为什么握手超时不起作用 【参考方案1】:

在 4.0.53.Final / 4.1.17.Final 版本之前,Netty 中不提供服务器端 SSL 握手超时。详情请见https://netty.io/news/2017/11/08/4-0-53-Final-4-1-17-Final.html

【讨论】:

以上是关于Netty 设置 SSL 握手超时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Netty 和 SSL websocket 客户端

Firebase - 切换到 WebSocket 协议 - 握手不起作用

设置 SSL 后 Keycloak 在 https 上不起作用

Hystrix 默认超时不起作用

JkEnvVar SSL_CLIENT_CERT 在“SSLVerifyClient 需要”时不起作用(在目录级别设置)

axios 库中的超时功能不起作用