Laden...

Probleme durch SSLStream

Erstellt von pfw3 vor einem Jahr Letzter Beitrag vor einem Jahr 1.115 Views
P
pfw3 Themenstarter:in
1 Beiträge seit 2022
vor einem Jahr
Probleme durch SSLStream

Hallo,

ich versuche einen Reverse-Proxy-Server für Telnet (um genau zu sein TN3270) zu schreiben. Ohne Verschlüsselung funktioniert mein Code, sobald ich hingegen die Verbindung zwischen der Clientanwendung und meinem Server verschlüssele treten zwei neue Probleme auf. Was mache ich falsch?

  1. terminalClient.Available ergibt zu hohe Werte, im Buffer hängen am ende zusätzliche Nullen an

  2. nach der Negotiation des Terminaltypes kommt keine Antwort. Sowohl terminalClient.Available als auch serverClient.Available geben nurnoch 0 zurück.

Unverschlüsselt bekomme ich folgendes in der Konsole raus:


S->T: IAC DO TERMINAL_TYPE

T->S: IAC WILL TERMINAL_TYPE

S->T: IAC SB TERMINAL_TYPE SEND IAC SE

T->S: IAC SB TERMINAL_TYPE 73 66 77 45 51 50 55 56 45 52 45 69 IAC SE

S->T: IAC DO END_OF_RECORD IAC WILL END_OF_RECORD

T->S: IAC WILL END_OF_RECORD IAC DO END_OF_RECORD

S->T: IAC DO IAC WILL

T->S: IAC WILL IAC DO

S->T: 245 66 17 [... hier folgt dann die erste Bildseite]

mit SSL hingegen bleibt es so stehen:


S->T: IAC DO TERMINAL_TYPE

T->S: IAC WILL TERMINAL_TYPE IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS [IS hat den Wert 0, daher diese Ausgabe]

S->T: IAC SB TERMINAL_TYPE SEND/ARE IAC SE

T->S: IAC SB TERMINAL_TYPE IS 73 66 77 45 51 50 55 56 45 52 45 69 IAC SE IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS IS

Das Problem liegt nicht an der Clientanwenung, ich habe sowohl Vista TN3270 als auch ZOC versucht. Beide funktionieren sowohl ohne Verschlüsselung im Proxy-Server als auch bei einer direkten Verbindung zum TN3270-Server (Hercules Emulator mit TK4-) jeweils problemlos.

Der relevante Code ist Folgender:


[...]
            var serverClient = new TcpClient();
            var connectTask = serverClient.ConnectAsync("127.0.0.1",3270, ct);
            Stream terminalStream;
            var authTask = Task.CompletedTask;
            if(!_tls)
                terminalStream = terminalClient.GetStream();
            else
            {
                var sslStream = new SslStream(terminalClient.GetStream(), false); 
                authTask = sslStream.AuthenticateAsServerAsync(new SslServerAuthenticationOptions
                {
                    ServerCertificate = _cert,
                    AllowRenegotiation = true,
                }, ct);
                terminalStream = sslStream;
            }
            await connectTask;
            var serverStream = serverClient.GetStream();
            serverClient.NoDelay = false;
            await authTask;
            terminalClient.NoDelay = false;
            async void Relay()
            {
                while (!ct.IsCancellationRequested && serverClient.Connected && terminalClient.Connected)
                {
                    if (serverClient.Available > 0)
                    {
                        var buffer = new byte[serverClient.Available];
                        _ = await serverStream.ReadAsync(buffer, ct);
                        await terminalStream.WriteAsync(buffer, 0, buffer.Length, ct);
                        await terminalStream.FlushAsync(ct);
                        Echo("S->T", buffer);
                    }
                    if (terminalClient.Available > 0)
                    {
                        var buffer = new byte[terminalClient.Available];
                        _ = await terminalStream.ReadAsync(buffer, ct);
                        await serverStream.WriteAsync(buffer, 0, buffer.Length, ct);
                        await serverStream.FlushAsync(ct);
                        Echo("T->S", buffer);
                    }
                }
            }
[...]
            new Thread(Relay).Start();
[...]
void Echo(string pf, params byte[] buffer)
        {
#if DEBUG
            if(buffer.Any(x=>x!=0))
                Console.WriteLine(pf + ": " + buffer.Select(x =>
                        x switch
                        {
                            TelnetCommands.IAC => "IAC",
                            [...]
                            TelnetCommands.IS => "IS",
                            _ => x.ToString(),
                        })
                    .Aggregate((ü,ä) => ü + " " + ä) + Environment.NewLine);
#endif
        }
[...]

MfG,
pfw3