none
Probleme mit sslstream und lokalen Zertifikaten RRS feed

  • Frage

  • Hallo Zusammen,

    ich habe ein Problem bei der Herstellung einer verschlüsselten Verbindung zu einem Server.

    Ich habe mir gedacht, für eine solche Verbindung währe die Klasse sslStream ganz gut geeignet, aber irgendwas mache ich noch falsch, kann mir jemand sagen was?
    Das ist mein Code:
            public static void RunClient(string machineName, string serverName)
            {
                // Create a TCP/IP client socket.
                // machineName is the host running the server application.
                TcpClient client = new TcpClient(machineName, 6000);
                Console.WriteLine("Client connected.");
                // Create an SSL stream that will close the client's stream.
                SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), new LocalCertificateSelectionCallback(SelectLocalCertificate));
                // The server name must match the name on the server certificate.
                try
                {
                    sslStream.AuthenticateAsClient(serverName); //Bei dieser Anweisung bekomme ich immer folgende FM: Das Remotezertifikat ist laut Validierungsverfahren ungültig.
                }
                catch (AuthenticationException e)
                {
                    Console.WriteLine("Exception: {0}", e.Message);
                    if (e.InnerException != null)
                    {
                        Console.WriteLine("Inner exception: {0}", e.InnerException.Message);
                    }
                    Console.WriteLine("Authentication failed - closing the connection.");
                    client.Close();
                    return;
                }
                // Encode a test message into a byte array.
                // Signal the end of the message using the "<EOF>".
                byte[] messsage = Encoding.UTF8.GetBytes("hallo");
                // Send hello message to the server.
                sslStream.Write(messsage);
                sslStream.Flush();
                // Read message from the server.
                string serverMessage = ReadMessage(sslStream);
                Console.WriteLine("Server says: {0}", serverMessage);
                // Close the client connection.
                client.Close();
                Console.WriteLine("Client closed.");
            }
    
            public static X509Certificate SelectLocalCertificate(object sender, string targetHost, X509CertificateCollection localCertificates, X509Certificate remoteCertificate, string[] acceptableIssuers)
            {
                if (acceptableIssuers != null && acceptableIssuers.Length > 0 && localCertificates != null && localCertificates.Count > 0)
                {
                    // Use the first certificate that is from an acceptable issuer.
                    foreach (X509Certificate certificate in localCertificates)
                    {
                        string issuer = certificate.Issuer;
                        if (Array.IndexOf(acceptableIssuers, issuer) != -1)
                            return certificate;
                    }
                }
                if (localCertificates != null && localCertificates.Count > 0)
                    return localCertificates[0];
    
                return null;
    
            }
    
            public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                if (sslPolicyErrors == SslPolicyErrors.None)
                    return true;
    
                Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
    
                // Do not allow this client to communicate with unauthenticated servers.
                return false;
            } 
    Das Problem tritt in dieser Zeile auf:
    sslStream.AuthenticateAsClient(serverName); //Bei dieser Anweisung bekomme ich immer folgende FM: Das Remotezertifikat ist laut Validierungsverfahren ungültig. 	
    Desweiteren sind die folgenden Variablen: targetHost, localCertificates, remoteCertificate und acceptableIssuers in der Funktion SelectLocalCertificate immer null oder leer.

    Das Zertifikat wurde übrigens bei den "vertrauenswürdigen Stammzertifizierungsstellen" hinterlegt.

    Könnt ihr mir sagen was ich falsch mache?
    Donnerstag, 2. April 2009 08:15

Antworten

Alle Antworten