2016-10-25 3 views
0

Ich bin netty 4.2 Socket Kommunikationscode mit SSL (selbst signiertes Zertifikat).Netty Server-Verbindung mit SSL löscht Client-Verbindung nach dem Aufruf

Mein Problem: Wenn Client versucht, auf dem Server mit SSL, Server sofort löscht die Verbindung zu verbinden. Der Server löst die channelUnregistered() -Methode sofort aus.

Ein Punkt, den ich bemerkte, sehr erstes Mal, wenn der Server gestartet, Client-Verbindung hält und funktioniert einwandfrei. Wenn der Client die Verbindung trennt und erneut versucht, eine Verbindung zum Server herzustellen, wird die Verbindung jedoch sofort getrennt.

Aber ohne SSL funktioniert es ohne Probleme in Ordnung.

Client-Code:

public Channel initializeNettySocket() 
{ 
    group = new NioEventLoopGroup(); 
    try 
    { 
     ClientAdapterInitializer clientAdapterInitializer = null; 
     if (ServerSettings.isUseSSL()) 
     { 
      //    SSLEngine engine = SSLContextFactory.getClientContext().createSSLEngine(); 
      SSLEngine engine = SSLContext.getDefault().createSSLEngine(host,port); 
      engine.setUseClientMode(true); 
      clientAdapterInitializer = new ClientAdapterInitializer(engine); 
     } 
     else 
     { 
      clientAdapterInitializer = new ClientAdapterInitializer(); 
     } 

     Bootstrap bootstrap = new Bootstrap().group(group).channel(NioSocketChannel.class).handler(clientAdapterInitializer); 

     channel = bootstrap.connect(host,port).sync().channel(); 
     Thread.sleep(3000); 

     setChannel(channel); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
    return channel; 
} 

    public class ClientAdapterInitializer extends ChannelInitializer<SocketChannel> 

{

private SSLEngine sslCtx = null; 

public ClientAdapterInitializer(SSLEngine sslCtx) 
{ 
    this.sslCtx = sslCtx; 
} 

public ClientAdapterInitializer() 
{ 
} 

@Override 
protected void initChannel(SocketChannel channel) throws Exception 
{ 
    ChannelPipeline pipeline = channel.pipeline(); 

    if (ServerSettings.isUseSSL()) 
    { 
     // Add SSL handler first to encrypt and decrypt everything. 
     // In this example, we use a bogus certificate in the server side 
     // and accept any invalid certificates in the client side. 
     // You will need something more complicated to identify both 
     // and server in the real world. 
     //pipeline.addLast(sslCtx.newHandler(ch.alloc(), SecureChatClient.HOST, SecureChatClient.PORT)); 
     pipeline.addLast(new SslHandler(sslCtx)); 
    } 
    pipeline.addLast("decoder", new StringDecoder()); 
    pipeline.addLast("encoder", new StringEncoder()); 
    pipeline.addLast("handler", new ClientAdapterHandler()); 

} 

Server-Side-Code

public class ServerAdapterInitializer extends ChannelInitializer<SocketChannel> 

{

private SSLEngine sslEngine; 

public ServerAdapterInitializer(SSLEngine sslEngine) 
{ 
    this.sslEngine = sslEngine; 
} 

public ServerAdapterInitializer() 
{ 
} 

@Override 
protected void initChannel(SocketChannel channel) throws Exception 
{ 
    ChannelPipeline pipeline = channel.pipeline(); 
    if (sslEngine != null) 
    { 
     pipeline.addLast(new SslHandler(sslEngine)); 
    } 
    Listeners.getInstance().getAllListeners().size(); 
    RTReceiverAdapterHandler rtReceiverAdapterHandler = new RTReceiverAdapterHandler(); 
    pipeline.addLast("idleStateHandler", new IdleStateHandler(0, 0, 10)); // add 
                      // with 
                      // name 
    pipeline.addLast("decoder", new MyStringDecoder(rtReceiverAdapterHandler)); 
    pipeline.addLast("encoder", new StringEncoder()); 

    pipeline.addLast("handler", rtReceiverAdapterHandler); 
} 

}

public class RTReceiverAdapterHandler extends ChannelInboundHandlerAdapter 
{ 
@Override 
public void channelActive(ChannelHandlerContext ctx) throws Exception 
{ 
    if (ServerSettings.isUseSSL()) 
    { 
     // Once session is secured, send a greeting and register the channel 
     // to the global channel 
     // list so the channel received the messages from others. 
     ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(new GenericFutureListener<Future<Channel>>() 
     { 
      @Override 
      public void operationComplete(Future<Channel> future) throws Exception 
      { 
       ctx.writeAndFlush("Welcome!\n"); 
       ctx.writeAndFlush("Your session is protected by " + ctx.pipeline().get(SslHandler.class).engine().getSession().getCipherSuite() 
         + " cipher suite.\n"); 
       channels.add(ctx.channel()); 
      } 
     }); 
    } 
    else 
    { 
     super.channelActive(ctx); 
    } 
} 

}

+0

Sie könnten versuchen, debug mit den folgenden Optionen zu protokollieren: System.setProperty ("javax.net.debug", "ssl"); System.setProperty ("ssl.debug", "true"); –

+0

ok, ich werde dies versuchen –

+0

Ich habe die gültigen Protokoll und Chiffren aktiviert. Das Problem, das ich bekam, war weg. Aber jetzt, Server einmal mit Client verbunden wartet einige Sekunden und schließt die Verbindung und in Client-I Ausnahme erhalten -> _nioEventLoopGroup-2-1, fataler Fehler: 80: Inbound geschlossen, bevor Peer close_notify Empfang: mögliche Abschneiden Angriff _ –

Antwort

0

Das Problem war nicht mit dem Code überhaupt. Wir haben den nginx Webserver vor meiner Anwendung mit SSL konfiguriert. Dieser Eintrag in nginx 'ssl_cipher AES256 + EECDH: AES256 + EDH:! ANULL;' war der Täter, der nicht erlaubte, auf den Netty-Server zuzugreifen.

kommentierte ich die obenstehenden Eintrag in ngnix und mein Problem gelöst wurde.

Verwandte Themen