SSLStream mit ClientZertifikat



  • 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;
            }
    

    Vielen dank im Voraus.

    Grüße Waldemar



  • Gib Dir wenigstens die Mühe zu beschreiben was passiert und was Du erwartest.



  • Hallo Knuddlbaer,

    ich hätte die Fehlermeldung vielleicht etwas auffälliger Posten können, da hast du recht.

    Das Problem tritt in der Zeile 12 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 bei den

    vertrauenswürdigen Stammzertifizierungsstellen

    hinterlegt.

    Hoffe ich habe mein Problem jetzt genauer dargelegt.

    Grüße
    Waldemar



  • Hallo zusammen,

    hat keiner eine Lösung oder zumindest einen Lösungsansatz für mein Problem, oder ist meine Problembeschreibung unklar bzw. unvollständig?

    Grüße
    Waldemar


Anmelden zum Antworten