Подключение к AWS IoT с помощью M2MQTT из ядра .net - PullRequest
0 голосов
/ 09 октября 2019

Мне удалось вручную создать конфигурацию AWS IoT, загрузить сертификаты и создать консольное приложение, которое могло бы подписаться на тему. Сейчас я пытаюсь автоматизировать создание вещи, в результате чего ключи сертификатов предоставляются AWS в виде строк. Я не уверен, как их использовать. У меня уже есть рут ca, который я предполагаю использовать для всех вещей.

Мой подписчик сертификата на основе файла выглядит следующим образом:

            Console.WriteLine("AWS IOT Dotnet core message listener starting");
            string iotendpoint = "blahblah-ats.iot.ap-southeast-2.amazonaws.com";
            int BrokerPort = 8883;
            string Topic = "topic_1/";

            var CaCert = X509Certificate.CreateFromCertFile(@"root-CA.crt");
            var ClientCert = new X509Certificate2(@"device.pfx", "password");

            var IotClient = new MqttClient(iotendpoint, BrokerPort, true, CaCert, ClientCert, MqttSslProtocols.TLSv1_2);

            try
            {
                IotClient.Connect(Guid.NewGuid().ToString());
                Console.WriteLine("Connected to AWS IOT");

                IotClient.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
                IotClient.MqttMsgSubscribed += Client_MqttMsgSubscribed;

                IotClient.Subscribe(new string[] { Topic }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });

                Console.ReadLine();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }

Чтобы загрузить сертификат из файла, я попыталсяэто:

    var keyText = File.ReadAllText("keys.json");
    var keys = JsonConvert.DeserializeObject<Keys>(keyText);
    var bytes = Encoding.ASCII.GetBytes(keys.PrivateKey.ToCharArray());
    var ClientCert = new X509Certificate2(bytes);

с:

    class Keys {
        public string PublicKey {get;set;}
        public string PrivateKey {get;set;}
    }

и ключами от AWS в файле json:

{
    "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpQIBAAKCAQEA4mh2PQ581XN9BmoCvDjlaktm/6gQgqGBItZThcQVMTjveU8H\npjOU2E/9lq7vmdO+96NuuMr9MKtFD+ZWtVExLjMq9hH0MvIvosVt9+6Ggcwz7Kdr\nigprfBMVORV0rgcK+nsd2DmBNrs339fqbTn5UAIFFBpqkNReW7LMl9h6g8hu4aYQ\nJTohDwSmgmNJKlzMJGtVfPggqt+bBi3lUf9NEOEz...
-----END RSA PRIVATE KEY-----\n",
    "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4mh2PQ581XN9BmoCvDjl\naktm/6gQgqGBItZThcQVMTjveU8HpjOU2E/9lq7vmdO+96NuuMr9MKtFD+ZWtVEx\nLjMq9hH0MvIvosVt9+6Ggcwz7K...
-----END PUBLIC KEY-----\n"
}

Я получаю ошибку при загрузке сертификата:

Необработанное исключение типа «Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException» произошло в System.Security.Cryptography.X509Certificates.dll: «Не удается найти запрошенный объект».

Может ли кто-нибудь увидеть что-либо явноздесь не так? Я не понимаю сертификаты ...

Обновление:

Использование текста PEM, созданного в AWS SDK, более правильно, но я все еще получаю ошибку при подключении - M2MQTT говоритесть проблема с сертификатом, у него нет закрытого ключа. Это нужно?

    var pemText = File.ReadAllText("thing.crt");
    var bytes = Encoding.ASCII.GetBytes(pemText);
    var ClientCert = new X509Certificate2(bytes);

1 Ответ

0 голосов
/ 10 октября 2019

Окончательное взломанное решение выглядит следующим образом:

    var keyText = File.ReadAllText("keys.json"); // saved from AWS SDK when creating IoT Cert.
    var keys = JsonConvert.DeserializeObject<Keys>(keyText);
    var rsa = RsaHelper.PrivateKeyFromPem(keys.PrivateKey);

    var pemText = File.ReadAllText("thing.crt");
    var bytes = Encoding.ASCII.GetBytes(pemText);

    var ClientCert = new X509Certificate2(bytes);
    ClientCert = ClientCert.CopyWithPrivateKey(rsa);
    ClientCert = new X509Certificate2(ClientCert.Export(X509ContentType.Pfx,"12345678"), "12345678");

RSAHelper из https://github.com/dejanstojanovic/dotnetcore-token-authentication/blob/asymmetric_rsahelper/Sample.Core.Common/Helpers/RsaHelper.cs

Последний трюк для экспорта и импорта PFX из https://github.com/aspnet/KestrelHttpServer/issues/2960 для устранения ошибки:«В пакете безопасности отсутствуют учетные данные»

Боковая панель - почему мы (как отрасль) всегда берем что-то концептуально простое и усложняем его? :)

...