Я пытаюсь внедрить MQTT в свою программу, используя M2MQTT v4.3.0.0 (github), но когда я пытаюсь подключиться с использованием подписанных сертификатов, мой код не может установить соединение. Я работаю в системе Windows 10 и использую С# с .NET 4.8. У меня установлена версия Mosquitto 2.0.10.
Чтобы сделать сертификат сервера, я следовал этому руководству: http://www.steves-internet-guide.com/mosquitto-tls/#server
Чтобы создать сертификат клиента, я следовал этому руководству: http://www.steves-internet-guide.com/creating-and-using-client-certificates-with-mqtt-and-mosquitto/
Я также сделал имя хоста в моем файле etc/hosts для 127.0.0.1, которое указывает на localhost.conrad.com.
Конфигурация моего брокера Mosquitto:
bind_address localhost.conrad.com
port 8883
allow_anonymous true
cafile C:/mosquitto/certs/ca.crt
keyfile C:/mosquitto/certs/server.key
certfile C:/mosquitto/certs/server.crt
require_certificate true
tls_version tlsv1.2
log_dest file C:/mosquitto/log/mosquitto.log
log_type error
log_type warning
log_type notice
log_type information
Я успешно проверил, что эта конфигурация работает с помощью инструмента публикации командной строки Mosquitto с
mosquitto_pub --cafile C:\mosquitto\certs\ca.crt --cert C:\mosquitto\certs\client.crt --key C:\mosquitto\certs\client.key -d -h localhost.conrad.com -p 8883 -t herp/derp/test -m "hi"
Я получил это сообщение после использования команды.
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'herp/derp/test', ... (2 bytes))
Client (null) sending DISCONNECT
Мой журнал Mosquitto подтверждает успешное подключение:
1621547553: New connection from 127.0.0.1:57874 on port 8883.
1621547553: New client connected from 127.0.0.1:57874 as auto-6A8387C3-E091-0EC6-CED7-0A78BAA63099 (p2, c1, k60).
1621547553: Client auto-6A8387C3-E091-0EC6-CED7-0A78BAA63099 disconnected.
Однако, когда я пытаюсь подключиться с помощью M2MQTT, у меня возникает проблема при попытке подключения с использованием подписанных сертификатов. Мой код выглядит следующим образом:
int securePort = 8883;
MqttClient client = null;
string subTopic1 = "herp/derp/test";
string subTopic2 = "herp/derp/test2";
X509Certificate caCert = new X509Certificate("C:/mosquitto/certs/ca.crt");
X509Certificate clientCert = new X509Certificate("C:/mosquitto/certs/client.crt");
string clientID = "TestClientID";
public MQTTTest()
{
try
{
client = new MqttClient("localhost.conrad.com", securePort, true, caCert, clientCert, MqttSslProtocols.TLSv1_2, RemoteCertificateValidationCallback);
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
client.MqttMsgPublished += client_MqttMsgPublished;
client.MqttMsgSubscribed += client_MqttMsgSubscribed;
client.ConnectionClosed += client_ConnectionClosed;
client.Connect(clientID, "", "", true, 1000);
client.Subscribe(new string[] { subTopic1, subTopic2 }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Я получаю следующее исключение при попытке client.Connect.
Exception message: "A call to SSPI failed, see inner exception."
Inner exception: "The message received was unexpected or badly formatted"
Мои журналы Mosquitto показывают:
1621547793: New connection from 127.0.0.1:57896 on port 8883.
1621547793: OpenSSL Error[0]: error:1417C0C7:SSL routines:tls_process_client_certificate:peer did not return a certificate
1621547793: Client <unknown> disconnected: protocol error.
Я могу установить незащищенные соединения просто отлично. Как написано, мой код также подключается, когда я устанавливаю require_certificate в false в моем конфигурационном файле Mosquitto; однако я беспокоюсь, что если для require_certificate установлено значение false, у меня не будет той безопасности, которую я хочу. Любая помощь будет принята с благодарностью.