Autor Wątek: SslStream w mono = error  (Przeczytany 1094 razy)

Offline ASTROMAG

  • Użytkownik

# Wrzesień 12, 2010, 16:12:10
Witam,
Pewien czas temu napisałem aplikację typu klient-serwer, komunikacja zabezpieczona jest protokołem SSL.
Niestety jak tylko chciałem odpalić aplikację serwerową pod linuxem (ubuntu 10.04 + mono 2.4.x), okazało się że aplikacja kliencka odpalona pod windowsem nie łączy się prawidłowo z serwerem.
Okazało się, że serwer zatrzymuje się na metodzie AuthenticateAsServer klasy SslStream.

Żeby sprawdzić co jest nie tak napisałem 2 małe aplikacje żaby nie babrać się w kodzie już gotowej aplikacji.
Aplikacja serwera zatrzymuje się w tym samym miejscu (bez wyrzucenia żadnego błędu)

Aplikacja serwera:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                TcpListener listener = new TcpListener(IPAddress.Any, 7777);
                listener.Start();

                X509Certificate cert = new X509Certificate2("XServerCertificate.pfx", "0987654321");

                while (true)
                {
                    TcpClient client = listener.AcceptTcpClient();
                    SslStream sslStream = new SslStream(client.GetStream());

                    sslStream.AuthenticateAsServer(cert, false, System.Security.Authentication.SslProtocols.Tls, false); // Aplikacja zatrzymuje się na działaniu tej metody
                    BinaryWriter writer = new BinaryWriter(sslStream, System.Text.Encoding.UTF8);
                    string s = "Witam :)";
                    writer.Write(s);
                    writer.Flush();
                    sslStream.Flush();
                    System.Threading.Thread.Sleep(500);
                    writer.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }
}

Aplikacja klienta:
namespace SslClient
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = new TcpClient();
            client.Connect(IPAddress.Parse("127.0.0.1"), 7777);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(Program.CWC));
            X509Certificate cert1 = new X509Certificate2("MyCa.cer");
            X509Certificate cert2 = new X509Certificate2("XServerCertificate.cer");
            X509Certificate[] certs = new X509Certificate[2];
            certs[0] = cert1;
            certs[1] = cert2;
            X509CertificateCollection cc = new X509CertificateCollection(certs);

            sslStream.AuthenticateAsClient("XServerCertificate", cc, System.Security.Authentication.SslProtocols.Ssl3, false);

            System.IO.BinaryReader reader = new System.IO.BinaryReader(sslStream, System.Text.Encoding.UTF8);

            Console.WriteLine(reader.ReadString());
            reader.Close();

            Console.WriteLine("Koniec");
            Console.ReadKey(false);

        }

        static bool CWC(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors errors)
        {
            if (errors == SslPolicyErrors.None)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

Może któryś z forumoiczów pomoże mi, gdyż nie wiem co jest nie tak.
Google jak dotąd nie przyniosło odpowiedzi.
Domyślam się, że problem leży w interpretacji certyfikatów pod linuxem (Z tymi samymi certyfikatami pod windowsem nie mam problemów).

PS. Spróbowałem powyższy kod uruchomić pod windowsem za pomocą najnowszego mono.
Oto jaki komunikat błędu otrzymałem:
Aplikacja kliencka:
Unhandled Exception: System.IO.IOException: The authentication or decryption has
 failed. ---> Mono.Security.Protocol.Tls.TlsException: Invalid certificate recei
ved from server.
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCe
rtificates (Mono.Security.X509.X509CertificateCollection certificates) [0x00000]
 in <filename unknown>:0
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsT
ls1 () [0x00000] in <filename unknown>:0
  at Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsS
sl3 () [0x00000] in <filename unknown>:0
  at Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process () [0x00000]
in <filename unknown>:0
  at (wrapper remoting-invoke-with-check) Mono.Security.Protocol.Tls.Handshake.H
andshakeMessage:Process ()
  at Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage (Mo
no.Security.Protocol.Tls.TlsStream handMsg) [0x00000] in <filename unknown>:0
  at Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback (IA
syncResult asyncResult) [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResu
lt asyncResult) [0x00000] in <filename unknown>:0

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline radsun

  • Użytkownik
    • CaRpg

# Wrzesień 12, 2010, 18:45:06
Nie wiem czy ma to związek z twoim problemem ale znalazłem to http://www.mono-project.com/UsingTrustedRootsRespectfully.
W szczególności chodzi mi o punkt "Approach #0: Ignore the problem" czyli przechwyć ten wyjątek i go zignoruj. Wtedy może zadziała...

Offline ASTROMAG

  • Użytkownik

# Wrzesień 17, 2010, 19:12:48