2017-05-16 2 views
0

Ich versuche, mit mosquitto Broker über m2mqtt C# Client Version 4.3.0 Bibliothek über SSL/TLS zu verbinden. Im Folgenden wird der Code habe ich versuchtEin Anruf an SSPI fehlgeschlagen, siehe innere Ausnahme paho m2mqtt Dot.Net (C#) Client SSL/TLS Verbindung

static void Main(string[] args) 
    { 

     // create client instance 
     MqttClient client = new MqttClient(IPAddress.Parse("127.0.0.1"), 8883, true, 
           new X509Certificate2("C:\\Users\\hp\\Desktop\\certificate\\ca.crt"), 
           new X509Certificate2("C:\\Users\\hp\\Desktop\\certificate\\client.crt"), 
           MqttSslProtocols.TLSv1_2); 

     // register to message received 
     client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 

     string clientId = "pahoSubscriber2"; 
     client.Connect(clientId); 

     // subscribe to the topic "hello" with QoS 0 
     client.Subscribe(new string[] { "hello" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); 

    } 

static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
    { 
     // handle message received 
     Console.WriteLine(e.Message); 
    } 

aber ich die Ausnahme bin immer

Ein Aufruf von SSPI fehlgeschlagen, siehe innere Ausnahme.

und die innere Ausnahme, sagt

die Nachricht war unerwartet empfangen oder schlecht

ich mit Broker erfolgreich verbinden können, ohne SSL/TLS

Informationen formatiert. Auch mit Paho Java-Client über beide mit oder ohne SSL/TLS kann ich eine Verbindung mit dem Broker herstellen. Diese Ausnahme tritt nur auf, wenn ich versuche, mich mit der m2mqtt C# -Client-Bibliothek über SSL/TLS zu verbinden. Jede Hilfe oder Beispielimplementierung wird geschätzt.

Antwort

0

Endlich die Lösung gefunden. Um das SSL-Zertifikat innerhalb des Dot.Net-Frameworks zu verwenden, müssen wir sowohl das Zertifikat als auch den zugehörigen privaten Schlüssel bereitstellen. Um dies zu erreichen, müssen wir p12 (.pfx) Datei verwenden, die diese beiden kombiniert. In meinem Projekt habe ich selbst signiertes Zertifikat verwendet ich unter Befehl OpenSSL so verwendet Zertifikat zu kombinieren und einen privaten Schlüssel

pkcs12 -export -out ca.pfx -inkey ca.key -in ca.crt 
pkcs12 -export -out client.pfx -inkey client.key -in client.crt 

die p12 (.pfx) wird erstellen für jedes Zertifikat einreichen. Dann habe ich sie in meinem Code wie unten

static void Main(string[] args) 
    { 

     // create client instance 
     MqttClient client = new MqttClient(IPAddress.Parse("127.0.0.1"), 8883, true, 
           new X509Certificate2("C:\\Users\\hp\\Desktop\\certificate\\ca.pfx"), 
           new X509Certificate2("C:\\Users\\hp\\Desktop\\certificate\\client.pfx"), 
           MqttSslProtocols.TLSv1_2); 

     // register to message received 
     client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 

     string clientId = "pahoSubscriber2"; 
     client.Connect(clientId); 

     // subscribe to the topic "hello" with QoS 0 
     client.Subscribe(new string[] { "hello" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); 

    } 

static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
    { 
     // handle message received 
     Console.WriteLine(e.Message); 
    } 
0

Als was ich erfahren Schlüsselpunkt installiert Zertifikat in der lokalen Maschine als Root-Zertifikat! Wenn die Datei "ca.crt" installiert ist, können Sie für beide Argumente einen Nullwert verwenden => caCert, clientCert. diese link hat mir nach ein paar Stunden verwirrend geholfen!

static void Main(string[] args){ 
// create client instance 
MqttClient client = new MqttClient(IPAddress.Parse("127.0.0.1"), 8883, true, null, null, MqttSslProtocols.TLSv1_2); 

    // register to message received 
    client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 

    string clientId = "pahoSubscriber2"; 
    client.Connect(clientId); 

    // subscribe to the topic "hello" with QoS 0 
    client.Subscribe(new string[] { "hello" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE }); 

} 

static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
{ 
    // handle message received 
    Console.WriteLine(e.Message); 
} 
Verwandte Themen