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 握手超时不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Firebase - 切换到 WebSocket 协议 - 握手不起作用
设置 SSL 后 Keycloak 在 https 上不起作用
JkEnvVar SSL_CLIENT_CERT 在“SSLVerifyClient 需要”时不起作用(在目录级别设置)