Demonstração de autenticação mútua da coreMQTT - FreeRTOS

Demonstração de autenticação mútua da coreMQTT

Importante

Essa demonstração está hospedada no repositório Amazon-FreeRTOS, que está preterido. Recomendamos começar aqui ao criar um novo projeto. Se você já tem um projeto FreeRTOS existente baseado no repositório Amazon-FreeRTOS que está preterido, consulte o Guia de migração do repositório Github do Amazon FreeRTOS.

Introdução

O projeto de demonstração da coreMQTT mostra como estabelecer uma conexão com um agente MQTT usando TLS com autenticação mútua entre o cliente e o servidor. Esta demonstração usa uma implementação de interface de transporte baseada em mbedTLS para estabelecer uma conexão TLS autenticada pelo servidor e pelo cliente e demonstra um fluxo de trabalho de publicação e assinatura de MQTT no nível de QoS 1. Ela assina um filtro de tópicos, em seguida, publica em tópicos que correspondem ao filtro e aguarda o recebimento dessas mensagens do servidor no nível de QoS 1. Esse ciclo de publicar para o agente e receber de volta a mesma mensagem do agente se repete indefinidamente. As mensagens nesta demonstração são enviadas QoS 1, o que garante pelo menos uma entrega de acordo com a especificação MQTT.

nota

Para configurar e executar as demonstrações do FreeRTOS, siga as etapas em Conceitos básicos do FreeRTOS.

Código-fonte

O arquivo de demonstração de origem é chamado mqtt_demo_mutual_auth.c e pode ser encontrado no diretório freertos/demos/coreMQTT/ e no site do GitHub.

Funcionalidade

A demonstração cria uma única tarefa de aplicação que percorre um conjunto de exemplos demonstrando como se conectar ao agente, assinar um tópico no agente, publicar em um tópico no agente e, enfim, se desconectar do agente. A aplicação de demonstração assina e publica o mesmo tópico. Cada vez que a demonstração publica uma mensagem para o agente MQTT, o agente envia a mesma mensagem de volta para a aplicação de demonstração.

A conclusão com êxito da demonstração gerará um resultado semelhante ao da imagem a seguir.

Saída do terminal de demonstração MQTT em caso de conclusão com êxito

O console AWS IoT gerará uma saída semelhante a da imagem a seguir.

Saída do console de demonstração MQTT em caso de conclusão com êxito

Lógica de repetição com recuo exponencial e jitter

A função prvBackoffForRetry mostra como operações de rede com falha no servidor, por exemplo, conexões TLS ou solicitações de assinatura de MQTT, podem ser repetidas com recuo exponencial e jitter. A função calcula o período de recuo para a próxima tentativa de repetição e executa o recuo se as tentativas de repetição não forem esgotadas. Como o cálculo do período de recuo exige a geração de um número aleatório, a função usa o módulo PKCS11 para gerar o número aleatório. O uso do módulo PKCS11 permite o acesso a um TRNG (Gerador de Números Aleatórios Verdadeiros) se a plataforma do fornecedor oferecer suporte a isso. Recomendamos que você alimente o gerador de números aleatórios com uma fonte de entropia específica do dispositivo para reduzir a probabilidade de colisões de dispositivos durante as novas tentativas de conexão.

Conexão ao agente MQTT

A função prvConnectToServerWithBackoffRetries tenta fazer uma conexão TLS mutuamente autenticada com o agente MQTT. Se a conexão falhar, ela tentará novamente após um período de recuo. O período de recuo aumentará exponencialmente até que o número máximo de tentativas ou o valor do período de recuo seja atingido. A função BackoffAlgorithm_GetNextBackoff fornecerá um valor de recuo aumentando exponencialmente e retornará RetryUtilsRetriesExhausted quando o número máximo de tentativas for atingido. A função prvConnectToServerWithBackoffRetries retornará um status de falha se a conexão TLS com o agente não puder ser estabelecida após o número configurado de tentativas.

A função prvCreateMqttConnectionWithBroker demonstra como estabelecer uma conexão MQTT com um agente MQTT com uma sessão limpa. Ela usa a interface de transporte TLS, que é implementada no arquivo FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c. Lembre-se de que estamos configurando os segundos de keep-alive para o agente em xConnectInfo.

A próxima função mostra como a interface de transporte TLS e a função de tempo são definidas em um contexto MQTT usando a função MQTT_Init. E mostra também como um ponteiro da função de retorno de chamada de evento (prvEventCallback) é definido. Esse retorno de chamada é usado para relatar mensagens recebidas.

Assinatura em um tópico MQTT

A função prvMQTTSubscribeWithBackoffRetries demonstra como se inscrever em um filtro de tópicos no agente MQTT. O exemplo demonstra como assinar um filtro de tópico, mas é possível passar uma lista de filtros de tópicos na mesma chamada de API de assinatura para assinar mais de um filtro de tópico. Além disso, caso o agente MQTT rejeite a solicitação de assinatura, a assinatura tentará novamente, com recuo exponencial, por RETRY_MAX_ATTEMPTS.

Publicar em um tópico

A função prvMQTTPublishToTopic demonstra como publicar em um tópico no agente MQTT.

Recebimento de mensagens

A aplicação registra uma função de retorno de chamada de evento antes de se conectar ao agente, conforme descrito anteriormente. A função prvMQTTDemoTask chama a função MQTT_ProcessLoop para receber mensagens. Quando uma mensagem MQTT é recebida, ela chama a função de retorno de chamada do evento registrada pela aplicação. A função prvEventCallback é um exemplo dessa função de retorno de chamada de evento. prvEventCallback examina o tipo de pacote recebido e chama o manipulador apropriado. No exemplo abaixo, a função chama prvMQTTProcessIncomingPublish() para manipular mensagens de publicação recebidas ou prvMQTTProcessResponse() para manipular confirmações (ACK).

Processamento de pacotes de publicação MQTT recebidos

A função prvMQTTProcessIncomingPublish demonstra como processar um pacote de publicação do agente MQTT.

Cancelar a inscrição em um tópico

A última etapa do fluxo de trabalho é cancelar a assinatura do tópico para que o agente não envie mensagens publicadas do mqttexampleTOPIC. Confira aqui a definição da função prvMQTTUnsubscribeFromTopic.

Alteração da CA raiz usada na demonstração

Por padrão, as demonstrações do FreeRTOS usam o certificado o Amazon Root CA 1 (chave RSA de 2048 bits) para obter autenticação no servidor do AWS IoT Core. É possível usar outros certificados CA para autenticação do servidor, incluindo o certificado Amazon Root CA 3 (chave ECC de 256 bits). Como alterar a CA raiz da demonstração de autenticação mútua da coreMQTT:

  1. Em um editor de texto, abra o arquivo freertos/vendors/vendor/boards/board/aws_demos/config_files/mqtt_demo_mutual_auth_config.h.

  2. No arquivo, localize a linha a seguir.

    * #define democonfigROOT_CA_PEM "...insert here..."

    Remover o comentário dessa linha e, se necessário, movê-lo para depois do final */ do bloco de comentários.

  3. Copie o certificado CA que você deseja usar e cole-o no texto "...insert here...". O resultado será algo semelhante a este exemplo:

    #define democonfigROOT_CA_PEM "-----BEGIN CERTIFICATE-----\n"\ "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\ "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\ "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\ "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\ "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\ "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\ "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\ "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\ "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\ "YyRIHN8wfdVoOw==\n"\ "-----END CERTIFICATE-----\n"
  4. (Opcional) Você pode alterar a CA raiz de outras demonstrações. Repita as etapas de 1 a 3 para cada arquivo freertos/vendors/vendor/boards/board/aws_demos/config_files/demo-name_config.h.