使用TLS将M2Mqtt.MqttClient连接到Mosquitto代理时获取AuthenticationException

时间:2017-12-13 12:46:27

标签: c# security ssl mqtt mosquitto

我是MQTT协议的新手。当我搜索MQTT服务器时,我发现Mosquitto代理是最常用的代理之一,因此我开始使用它。我必须在C#/ .NET上开发一个MQTT客户端,我只发现了M2Mqtt项目和C# MQTT client example

我设法install Mosquitto broker on Windows 10change the access control list using topics。使用MqttClient我可以使用用户名连接到代理,订阅主题并使用以下代码发布它们。

连接:

byte result = this.mqttClient.Connect(Guid.NewGuid().ToString(), username, string.Empty);

订阅:

this.mqttClient.Subscribe(new string[] { topic }, new byte[] { 2 });

发布:

ushort result = this.mqttClient.Publish(topic, message, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, true);

现在我想在通信中添加安全性。我按照这些steps to create the CA certificate, the server key and server certificate(我创建了两次证书)。我更改了mosquito.conf文件,如链接中所述:

port 8883
cafile C:\mosquitto\certs\ca.crt
certfile C:\mosquitto\certs\server.crt
keyfile C:\mosquitto\certs\server.key

我不知道是否有必要,但我在these steps之后将ca.crt添加到受信任的根证书。

我更改了客户端以在连接中使用CA证书:

//this.mqttClient = new MqttClient(brokerAddress);
X509Certificate caCertificate = new X509Certificate("ca.crt");
this.mqttClient = new MqttClient(brokerAddress, 8883, true, caCertificate, null, MqttSslProtocols.TLSv1_0);

ca.crt文件的副本位于.exe文件的同一文件夹中。当我运行应用程序时,我总是得到相同的异常:

  • uPLibrary.Networking.M2Mqtt.Exceptions.MqttConnectionException:连接到经纪人的例外
  • [内部异常] System.Security.Authentication.AuthenticationException:根据验证程序,远程证书无效。

你知道我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

设法让这个工作。 我没有使用ca.crt将证书导出到ca.pfx,而是在客户端计算机的受信任的根证书颁发机构缓存中安装了.pfx证书。

要安装,只需右键单击该文件,选择“本地计算机”,然后根据需要完成提示。选择本地计算机并选择正确的证书存储区("受信任的根证书颁发机构")至关重要。