首次客户端断开连接后,Resteasy Netty Server不会握手

时间:2017-01-20 15:09:26

标签: java ssl jax-rs netty resteasy

使用NettyJaxrsServer和SSL时遇到问题。第一个请求成功,后续超时。通常,如果我使用curl发送HTTPS请求,则只有第一个呼叫通过。我和wireshark一起检查了发生了什么。服务器仅对第一个请求执行握手。对于第二个请求,客户端发送“Hello”消息,服务器不继续握手。看起来服务器即使在客户端断开连接后仍保持SSL会话。

enter image description here

我验证了代码,并且对于每个客户端连接,在客户端管道中插入了新的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

0 个答案:

没有答案