С# m2mqtt для подключения к брокеру AWS с использованием корневого ЦС, ключа и сертификата.

Я пытаюсь использовать библиотеку M2MQtt для подключения к брокеру AWS MQTT с использованием корневого ЦС, клиентский сертификат и ключ. Я использую следующий код подключения клиента С#

MqttClient client = new MqttClient(
    endPoint, 
    MqttSettings.MQTT_BROKER_DEFAULT_SSL_PORT,
    true,
    new X509Certificate2(@"ca.pem"),
    new X509Certificate2(@"certificate.pem"),
    MqttSslProtocols.TLSv1_2 
    );
client.Connect(Guid.NewGuid().ToString());

однако это не удается с ошибкой FormatException. Вероятно, это связано с тем, что я не знаю, куда передать закрытый ключ для этого соединения. Это то, что у меня уже есть, прототипировано на Python с использованием AWSIoTPythonSDK (см. ниже).

from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

f = open('mqttEndpoint.txt', 'r')
awsHost = f.read()
f.close()

myAWSIoTMQTTClient = AWSIoTMQTTClient('foo')
myAWSIoTMQTTClient.configureEndpoint(awsHost, 8883)
myAWSIoTMQTTClient.configureCredentials('ca.pem', 'id_rsa', 'certificate.pem')

Кто-нибудь знает, как это должно работать?


person Paul Grinberg    schedule 27.03.2017    source источник


Ответы (1)


Я понял свою проблему. Подсказка заключалась в том, что для правильной аутентификации в AWS вам необходимо предоставить как сертификат (в моем случае PEM), так и закрытый ключ, который я не мог понять, как передать в конструктор MqttClient(), потому что он принимает только один «сертификат».

Решение состоит в том, чтобы использовать сертификат PFX/P12, который включает в себя как PEM, так и закрытый ключ (спасибо, Microsoft, за отличие). Существует множество ресурсов, объясняющих, как создать PFX из ключа PEM+ (т. е. здесь, здесь, здесь, здесь и т. д.). Затем вам нужно использовать класс X509Certificate2() для извлечения файла PFX (это '2'

MqttClient client = new MqttClient(
    endPoint,
    MqttSettings.MQTT_BROKER_DEFAULT_SSL_PORT,
    true,
    rootCa,
    new X509Certificate2(@"certificate.pfx", @""); // My PFX was created with a blank password, hence empty string as 2nd arg
    MqttSslProtocols.TLSv1_2
    );
client.Connect(Guid.NewGuid().ToString());
person Paul Grinberg    schedule 29.03.2017
comment
rootCa тоже .pfx? Извините, но у меня тоже много проблем - person BlackShawarna; 05.04.2018