2016-08-09 166 views
0

Ich versuche eine Verbindung zu Kafka herzustellen, wenn TLS von C# -Client aktiviert ist und die Ausnahme "Die empfangene Nachricht wurde unerwartet oder schlecht formatiert" während empfangen wird Anruf an sslStream.AuthenticateAsClient(). Leider hat mir bisher keiner der Beiträge im Internet geholfen, das Problem zu lösen. Irgendeine Idee, was kann falsch sein?C# -> Kafka über TLS: "Die empfangene Nachricht war unerwartet oder falsch formatiert"

ist hier minimal I C# Codebeispiel verwendete Verbindung

namespace test_tls { 
    class Program { 
     static string clientCertificateFile = "C:\\Temp\\<CLIENT_CERTIFICATE_FILE>.crt"; 
     static X509Certificate2 clientCertificate = new X509Certificate2(clientCertificateFile); 

     static void Main(string[] args) { 
      var clientCertificateCollection = new X509Certificate2Collection(new X509Certificate2[] { clientCertificate }); 

      try { 
       using(var client = new TcpClient("<IP_ADDRESS>", 9093)) 
       using(var sslStream = new SslStream(client.GetStream(), false, CertificateValidator)) { 

        sslStream.AuthenticateAsClient("<TARGET_HOST_NAME_AS_IN_THE_CERTIFICATE>", 
         clientCertificateCollection, SslProtocols.Tls, false); 

        //send/receive from the sslStream 
       } 
      } 
      catch(Exception e) { 
       Console.Out.WriteLine(e); 
       Console.Out.WriteLine("\n\n\nPress ENTER to exit"); 
       Console.In.ReadLine(); 
      } 
     } 

     static bool CertificateValidator(Object sender, 
       X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { 
      if(sslPolicyErrors == SslPolicyErrors.None) { 
       return true; 
      } 
      if(sslPolicyErrors == SslPolicyErrors.RemoteCertificateChainErrors) { 
       //we don't have a proper certificate tree 
       return true; 
      } 
      return false; 
     } 
    } 
} 

Antwort

0

zu initiieren und nach einigen graben, dass Fehlermeldung erscheint, ist absolutelly irreführend und die Ursache des Problems ist - ‚private Schlüssel des Client-Zertifikats‘ fehlte während des Verbindungsvorgangs.

X509Certificate2 entweder geladen werden soll auf diese Weise mit

string clientCertificateFile = "C:\\path\\to\\my.certificate.pfx"; 
X509Certificate2 clientCertificate = new X509Certificate2(clientCertificateFile, "<password>"); 

oder von lokalen Zertifikatspeicher (und es sollte mit einem privaten Schlüssel dort importiert werden)

X509Store store = new X509Store(StoreLocation.CurrentUser); 
store.Open(OpenFlags.ReadOnly); 
X509Certificate2 cert = store.Certificates.Find(X509FindType.FindBySubjectName, "<Certificate 'Issued To' name>", false)[0]; 

Hinweis: Wenn Sie Sie Zertifikat und privaten Schlüssel in separaten Dateien, kann dieser Befehl verwendet werden, um sie in PFX-Datei

openssl pkcs12 -export -in my.cer -inkey my.key -out mycert.pfx 
zusammenführen