# TLS Support auf Netty



## xTailsPvP (27. Dez 2020)

Hallo,
ich habe eine Netty Server-Client Verbindung und möchte die Kommunikation über eine TLS machen, damit die Verbindung verschlüsselt ist.
Aber bin mir leider nicht sicher, wie ich eine Netty Server-Client Kommunikation über TLS machen kann.

Danke schonmal für eure Antworten!


----------



## thecain (27. Dez 2020)

Erstes Google Ergebnis...




__





						SslHandler (Netty API Reference (4.0.56.Final))
					





					netty.io


----------



## xTailsPvP (27. Dez 2020)

thecain hat gesagt.:


> Erstes Google Ergebnis...
> 
> 
> 
> ...



Ich weiß nicht, ob das so weit stimmt, wie ich das gemacht habe.


```
KeyManager km = new KeyManager() {
}
SslContext ssl = SslContextBuilder.forServer(km).protocols("TLSv1.3").build();
```


```
ChannelPipeline pipeline = channel.pipeline();
                    pipeline.addLast("ssl", ssl.newHandler(channel.alloc()));
                    pipeline.addLast(new StringEncoder(CHARSET),
                            new LineBasedFrameDecoder(MAX_LINE_LENGTH), new StringDecoder(CHARSET),
                            new ServerListener());
```

So habe ich das bis jetzt gemacht. Ich hoffe das stimmt soweit.


----------



## thecain (27. Dez 2020)

Hast du das Beispiel denn angeschaut?


----------



## xTailsPvP (27. Dez 2020)

thecain hat gesagt.:


> Hast du das Beispiel denn angeschaut?


Ja, aber es funktioniert nicht...

[CODE lang="java" title="Netty-Server"]                    KeyManager km = new KeyManager() {
                    };
                    SslContext context = SslContextBuilder.forServer(km).protocols("TLSv1.3").build();
                    SslHandler sslhandler = new SslHandler(
                            context.newEngine(channel.alloc(), SERVER_HOST, PORT), true);

                    ChannelPipeline pipeline = channel.pipeline();
                    pipeline.addLast("ssl", sslhandler);
                    pipeline.addLast(new StringEncoder(CHARSET),
                            new LineBasedFrameDecoder(MAX_LINE_LENGTH), new StringDecoder(CHARSET),
                            new ServerListener());[/CODE]

[CODE lang="java" title="Netty-Client"]                SslContext context = SslContextBuilder.forClient().protocols("TLSv1.3").build();
                SslHandler sslhandler = new SslHandler(
                        context.newEngine(channel.alloc(), SERVER_HOST, PORT), false);
                ChannelPipeline pipeline = channel.pipeline();
                pipeline.addLast("ssl", sslhandler);
                pipeline.addLast(new StringEncoder(CHARSET),
                        new LineBasedFrameDecoder(MAX_LINE_LENGTH), new StringDecoder(CHARSET),
                        Client.clientListener);[/CODE]


----------



## kneitzel (27. Dez 2020)

Das erste wichtige ist: Was heißt, dass es nicht funktioniert? Was passiert? Was für Fehlermeldungen bekommst Du? Das ist so in der Form mal wieder ein Stochern im Nebel....

Also gemäß dem Buch "Netty in action", Kapitel 11, sollte der SslHandler Konstructor vom Client mit true und beim Server mit false aufgerufen werden. Das ist bei dir umgekehrt. Was das bewirkt / ausmacht: Da fehlt mir der Überblick.

Ansonsten vielleicht noch der Hinweis, dass Du zur Not den Rahmen von https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/securechat verwenden kannst. Das ist das SecureChat Beispiel von netty...

Ansonsten noch gibt es auch noch https://medium.com/@maanadev/netty-with-https-tls-9bf699e07f01 das evtl. etwas hilfreiches enthalten könnte ...


----------



## xTailsPvP (27. Dez 2020)

kneitzel hat gesagt.:


> Das erste wichtige ist: Was heißt, dass es nicht funktioniert? Was passiert? Was für Fehlermeldungen bekommst Du? Das ist so in der Form mal wieder ein Stochern im Nebel....
> 
> Also gemäß dem Buch "Netty in action", Kapitel 11, sollte der SslHandler Konstructor vom Client mit true und beim Server mit false aufgerufen werden. Das ist bei dir umgekehrt. Was das bewirkt / ausmacht: Da fehlt mir der Überblick.
> 
> ...



Also ich habe den Fehler herausgefunden, doch weiß nicht, wie ich es fixen soll:

Code:
[CODE lang="java" title="Netty-Server"]                    SelfSignedCertificate ssc = new SelfSignedCertificate();
                    SslContext context = SslContextBuilder
                            .forServer(ssc.certificate(), ssc.privateKey()).protocols("TLSv1.3")
                            .build();

                    SslHandler sslhandler = context.newHandler(channel.alloc());
                    ChannelPipeline pipeline = channel.pipeline();
                    pipeline.addLast(sslhandler);
                    pipeline.addLast(new StringEncoder(CHARSET),
                            new LineBasedFrameDecoder(MAX_LINE_LENGTH), new StringDecoder(CHARSET),
                            new ServerListener());[/CODE]

[CODE lang="java" title="Netty-Client"]                SslContext context = SslContextBuilder.forClient().protocols("TLSv1.3")
                        .trustManager(InsecureTrustManagerFactory.INSTANCE).build();
                SslHandler sslhandler = context.newHandler(channel.alloc(), SERVER_HOST, PORT);

                ChannelPipeline pipeline = channel.pipeline();
                pipeline.addLast(sslhandler);
                pipeline.addLast(new StringEncoder(CHARSET),
                        new LineBasedFrameDecoder(MAX_LINE_LENGTH), new StringDecoder(CHARSET),
                        Client.clientListener);[/CODE]


[CODE lang="java" title="Fehler"]Dez 27, 2020 3:37:43 PM io.netty.channel.ChannelInitializer exceptionCaught
WARNUNG: Failed to initialize a channel. Closing: [id: 0x19530208]
java.lang.IllegalArgumentException: TLSv1.3
    at sun.security.ssl.ProtocolVersion.valueOf(Unknown Source)
    at sun.security.ssl.ProtocolList.convert(Unknown Source)
    at sun.security.ssl.ProtocolList.<init>(Unknown Source)
    at sun.security.ssl.SSLEngineImpl.setEnabledProtocols(Unknown Source)
    at io.netty.handler.ssl.JdkSslContext.configureAndWrapEngine(JdkSslContext.java:342)
    at io.netty.handler.ssl.JdkSslContext.newEngine(JdkSslContext.java:336)
    at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:1007)
    at io.netty.handler.ssl.SslContext.newHandler(SslContext.java:999)
    at de.tails.chatsystem.main.ChatSystem$2.initChannel(ChatSystem.java:84)
    at de.tails.chatsystem.main.ChatSystem$2.initChannel(ChatSystem.java:1)
    at io.netty.channel.ChannelInitializer.initChannel(ChannelInitializer.java:129)
    at io.netty.channel.ChannelInitializer.handlerAdded(ChannelInitializer.java:112)
    at io.netty.channel.AbstractChannelHandlerContext.callHandlerAdded(AbstractChannelHandlerContext.java:938)
    at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:609)
    at io.netty.channel.DefaultChannelPipeline.access$100(DefaultChannelPipeline.java:46)
    at io.netty.channel.DefaultChannelPipeline$PendingHandlerAddedTask.execute(DefaultChannelPipeline.java:1463)
    at io.netty.channel.DefaultChannelPipeline.callHandlerAddedForAllHandlers(DefaultChannelPipeline.java:1115)
    at io.netty.channel.DefaultChannelPipeline.invokeHandlerAddedIfNeeded(DefaultChannelPipeline.java:650)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:502)
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:417)
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:474)
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500)
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Unknown Source)[/CODE]

So wie ihr seht ist der Fehler bei der Methode: .protocols("TLSv1.3")
Ich habe es vorhin auf "TLSv1.2" umgeändert und es hat geklappt. 
Aber ich möchte klarerweise TLSv1.3 nutzen. Weiß jemand was ich dazu machen muss?


----------



## kneitzel (27. Dez 2020)

Welche Version von netty nutzt Du? TLSv1.3 wird erst ab 4.1.56 per default enabled:








						Enable TLS1.3 by default of JDK SSLEngine implementation does by defa… · netty/netty@b1d3aad
					

…ult (#10451)  Motiviation:  When TLSv1.3 was introduced almost 2 years ago, it was decided to disable it by default, even when it's supported by the underlying TLS implementation.  TLSv13 ...




					github.com
				




Und die Java version spielt evtl. auch eine Rolle - TLS 1.3 ist ab Java 11 drin. Aber Netty nutzt normalerweise OpenSSL und nicht die Java Engine meine ich ... aber da bin ich auch kein Experte muss ich gestehen. Mit Netty habe ich bisher kaum gearbeitet.


----------



## xTailsPvP (27. Dez 2020)

Meine Netty Version:
[CODE lang="java" title="Netty Version"]     <dependencies>
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <version>4.1.56.Final</version>
        <scope>compile</scope>
  </dependency>
</dependencies>[/CODE]

Ich nutze die Java Version 8 und vermutlich liegt es wie du gesagt hast daran.
Aber ich habe folgendes gefunden: https://netty.io/news/2018/10/30/4-1-31-Final.html
Hier steht das man TLS1.3 ab Java 11 *oder mit netty-tcnative / netty-tcnative-boringssl-static nutzen kann.*
Aber wie kann man denn eine netty-tcnative/netty-tcmative-boringssl-static nutzen?


----------



## kneitzel (27. Dez 2020)

Ggf. in dem man die Dependencie austauscht:





						Maven Repository: io.netty » netty-tcnative-boringssl-static
					






					mvnrepository.com
				




Ob dies die vorhandene ersetzt oder dazu genommen werden soll, musst Du ausprobieren....


----------



## kneitzel (27. Dez 2020)

Ach ja - das tcnative gibt es natürlich ebenso:





						Maven Repository: io.netty » netty-tcnative
					






					mvnrepository.com


----------



## xTailsPvP (27. Dez 2020)

kneitzel hat gesagt.:


> Ach ja - das tcnative gibt es natürlich ebenso:
> 
> 
> 
> ...


Man muss sie dazu tun. Vielen Dank!


----------

