Проблемы с установлением безопасного подключения к Mosquitto Broker 2.0.10 с использованием M2MQTT v4.3.0.0 и подписанных сертификатов

Я пытаюсь внедрить 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, у меня не будет той безопасности, которую я хочу. Любая помощь будет принята с благодарностью.


person s3n4taur    schedule 20.05.2021    source источник
comment
Помогает ли этот ответ?   -  person Brits    schedule 21.05.2021
comment
@Британцы Спасибо, это сработало.   -  person s3n4taur    schedule 21.05.2021


Ответы (1)


Благодаря комментарию британцев я смог это понять (ссылка на ответ). Я сделал сертификат pfx и использовал его вместо использования crt.

Вместо...

X509Certificate caCert = new X509Certificate("C:/mosquitto/certs/ca.crt");
X509Certificate clientCert = new X509Certificate("C:/mosquitto/certs/client.crt");

Я использовал...

X509Certificate2 caCert = new X509Certificate2("C:/mosquitto/certs/ca.pfx", "password");
X509Certificate2 clientCert = new X509Certificate2("C:/mosquitto/certs/client.pfx", "password");
person s3n4taur    schedule 21.05.2021