Trying to connect to Amazon IOT server. Got error:
MQTTnet.Adapter.MqttConnectingFailedException: 'Error while authenticating. Connection closed.'
What might be wrong?
using System;
using MQTTnet;
using Oocx.ReadX509CertificateFromPem;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet.Client;
namespace MQTT_IOT
{
class Program
{
private static string certificateAuthorityCertPEMString;
private static string deviceCertPEMString;
private static string devicePrivateCertPEMString;
private static String curDir = @"C:\c#test\mqtt_net\";
static async Task Main(string[] args)
{
// Create a new MQTT client.
var factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient();
var broker = @"xxx-ats.iot.eu-central-1.amazonaws.com";
var port = 8883;
deviceCertPEMString = File.ReadAllText(curDir+ @"client_cert.pem");
devicePrivateCertPEMString = File.ReadAllText(curDir+ @"client_private_key.pem");
certificateAuthorityCertPEMString = File.ReadAllText(curDir+ @"ca_cert.pem");
//Converting from PEM to X509 certs in C# is hard
//Load the CA certificate
var certBytes = Encoding.UTF8.GetBytes(certificateAuthorityCertPEMString);
var signingcert = new X509Certificate2(certBytes);
//Load the device certificate
//Use Oocx.ReadX509CertificateFromPem to load cert from pem
var reader = new CertificateFromPemReader();
X509Certificate2 deviceCertificate = reader.LoadCertificateWithPrivateKeyFromStrings(deviceCertPEMString, devicePrivateCertPEMString);
// Certificate based authentication
List<X509Certificate> certs = new List<X509Certificate>
{
signingcert,
deviceCertificate
};
MqttClientOptionsBuilderTlsParameters tlsOptions = new MqttClientOptionsBuilderTlsParameters();
tlsOptions.Certificates = certs;
tlsOptions.SslProtocol = System.Security.Authentication.SslProtocols.Tls12;
tlsOptions.UseTls = true;
tlsOptions.AllowUntrustedCertificates = true;
var options = new MqttClientOptionsBuilder()
.WithTcpServer(broker, port)
.WithClientId("dev1")
.WithTls(tlsOptions)
.Build();
await mqttClient.ConnectAsync(options, CancellationToken.None);
var message = new MqttApplicationMessageBuilder()
.WithTopic("test")
.WithPayload("Hello World")
.Build();
await mqttClient.PublishAsync(message, CancellationToken.None);
}
}
}