Я надеюсь, что вы можете помочь мне здесь. Я пытаюсь создать клиент MQTT (функция Azure в среде службы приложений), который извлекает данные из брокера MQTT (hivemq), но я немного теряюсь, когда дело доходит до сертификатов (я не эксперт).
Так или иначе, я получил 3 файла (см. ниже) от нашего партнера (это они с брокером MQTT), но вопрос. Как мне использовать эти файлы PEM в приложении??
Вот приложение, а вот пример, где я протестировал его локально (с сертификатом crt) на тестовом брокере (test.mosquitto.org). Это сработало отлично, но теперь мне нужно то же самое, только с 3 файлами PEM.
Я также подозреваю, что мне нужно что-то сделать в Azure (либо на уровне приложения-функции, либо на уровне среды службы приложений), чтобы использовать эти сертификаты?
// Create a new MQTT client.
var factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient();
// Load certificate
X509Certificate caCertificate = new X509Certificate(@"..\mosquitto.org.crt");
// Create TLS based parameters.
var tlsParameters = new MqttClientOptionsBuilderTlsParameters
{
UseTls = true,
Certificates = new List<X509Certificate> { caCertificate },
SslProtocol = System.Security.Authentication.SslProtocols.Tls12
};
// Create TCP based options using the builder.
var connectOptions = new MqttClientOptionsBuilder()
.WithTcpServer("test.mosquitto.org", 8883)
.WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
.WithTls(tlsParameters)
.Build();
var conResult = await mqttClient.ConnectAsync(connectOptions);
mqttClient.UseConnectedHandler(e =>
{
Console.Write("Connected successfully with MQTT Brokers.");
});
mqttClient.UseDisconnectedHandler(e =>
{
Console.Write("Disconnected from MQTT Brokers.");
});
.crt
файлы обычно содержат ключи/сертификаты в кодировке PEM, поэтому в этом случае расширение файла не имеет значения.
Вы должны быть в состоянии заменить mosquitto.org.crt
на server.pem
.
Остальные 2 файла предназначены для так называемой взаимной аутентификации TLS. Для большинства подключений TLS (например, при выполнении HTTPS-запроса к веб-странице) только одна сторона подключения нуждается в сертификате/закрытом ключе. Это сервер. Клиент использует коллекцию сертификатов ЦС для подтверждения того, что служба является тем, за что себя выдает. (Это то, что вы делаете, используя файл mosquitto.org.crt
).
В других случаях мы хотим аутентифицировать оба конца соединения (клиент хочет знать, что такое сервер, а сервер хочет знать, кто такой клиент). Для этого клиент также должен предоставить серверу сертификат, для этого предназначены два других файла.
Документация MQTTNet включает пример настройки соединения с использованием клиентских сертификатов здесь, но при этом используется .pfx
(pfx — это просто другое имя контейнера PKCS12, при необходимости вы можете преобразовать файлы .pem
в .pfx/.p12 файл с использованием openssl, например openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem
)
List<X509Certificate> certs = new List<X509Certificate>
{
new X509Certificate2("myCert.pfx")
};
var options = new MqttClientOptionBuilder()
.WithTcpServer(broker, port)
.WithTls(new MqttClientOptionsBuilderTlsParameters
{
UseTls = true,
Certificates = certs
})
.Build();
@Zaz извините, была опечатка, так и должно быть -CAfile
. я обновил ответ
Привет @hardillb, спасибо за помощь и извините за поздний ответ. Из-за коронавируса мы были закрыты, но теперь мы снова в игре.
Может быть, я должен был быть более ясным. Функция Azure — это триггер времени, который срабатывает каждые 5 секунд для получения нового контента с сервера. Вы все еще думаете, что мне следует использовать взаимную аутентификацию TLS? Я последовал вашему примеру и преобразовал файлы в файл .pfx/.p12, используя openssl, например. openssl pkcs12 -export -out mqtt-client.p12 -inkey mqtt-client-key_nopass.pem -in mqtt-client-cert.pem -CAfile server.pem, но здесь я получаю исключение: «Учетные данные, предоставленные пакету не были признаны"???
Привет hardillb, Спасибо за вашу помощь. Это мне очень помогло и дало более глубокое понимание. Теперь я пытаюсь преобразовать файлы .pem в файл pfx/.p12, как вы указали в своем примере, но здесь я получаю сообщение об ошибке: непризнанный флаг CAFile?