使用NettyJaxrsServer和SSL时遇到问题。第一个请求成功,后续超时。通常,如果我使用curl发送HTTPS请求,则只有第一个呼叫通过。我和wireshark一起检查了发生了什么。服务器仅对第一个请求执行握手。对于第二个请求,客户端发送“Hello”消息,服务器不继续握手。看起来服务器即使在客户端断开连接后仍保持SSL会话。
我验证了代码,并且对于每个客户端连接,在客户端管道中插入了新的SSLHandler,但使用了相同的SSLEngine。
final SSLEngine engine = sslContext.createSSLEngine();
engine.setUseClientMode(false);
bootstrap.group(eventLoopGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addFirst(new SslHandler(engine));
ch.pipeline().addLast(channelHandlers.toArray(new ChannelHandler[channelHandlers.size()]));
ch.pipeline().addLast(new HttpRequestDecoder());
ch.pipeline().addLast(new HttpObjectAggregator(maxRequestSize));
ch.pipeline().addLast(new HttpResponseEncoder());
ch.pipeline().addLast(new RestEasyHttpRequestDecoder(dispatcher.getDispatcher(), root, RestEasyHttpRequestDecoder.Protocol.HTTPS));
ch.pipeline().addLast(new RestEasyHttpResponseEncoder());
ch.pipeline().addLast(eventExecutor, new RequestHandler(dispatcher));
}
})
.option(ChannelOption.SO_BACKLOG, backlog)
.childOption(ChannelOption.SO_KEEPALIVE, true);
从Netty文档中,我了解每个新客户端连接都应使用新的SSLEngine:
重新开始会话
要重新启动SSL会话,您必须从ChannelPipeline中删除现有的已关闭SslHandler,将带有新SSLEngine的新SslHandler插入管道,然后按照第一部分所述启动握手过程。
有人可以解释这种行为吗?或者这是Netty resteasy服务器中的错误?
二手版本:resteasy-netty4 3.0.11.Final