5. Usando MQTT com segurança (TLS)

Nota

  • Público: usuários

  • Nível: intermediário

  • Tempo de leitura: 15 m

Este documento descreve como configurar a dojot e publicar/subscrever usando MQTT com TLS (MQTTS) ao usar o microsserviço Broker MQTT IotAgent-VerneMQ ou Broker MQTT legado IotAgent-Mosca.

5.1. Componentes

5.1.1. X.509 Identity Management

O objetivo deste componente é fornecer identificação x.509 para entidades dojot finais, ou seja, dispositivos IoT que se comunicam com a plataforma de IoT dojot. Veja mais sobre em X.509 Identity Management.

5.1.1.1. O que é um certificado?

Um certificado contém a chave pública de uma entidade (um usuário, dispositivo, website), juntamente com informações sobre essa entidade, sobre a CA que assina o certificado, o uso permitido do certificado e uma soma de verificação. Quando uma entidade deseja que um certificado seja assinado, a entidade deve criar um arquivo CSR e enviá-lo para a CA desejada. O arquivo CSR é uma ‘intenção de certificação’. O arquivo contém as informações necessárias da entidade e algumas informações sobre o uso do certificado, nomes de host e IPs onde o certificado residirá, nomes alternativos para a entidade etc.

5.1.2. MQTT Broker

5.1.2.1. IotAgent VerneMQ

O IotAgent VerneMQ estende o VerneMQ com alguns recursos e serviços para o caso da dojot, veja mais em IotAgent-VerneMQ. Este é o Broker MQTT padrão em deployments dojot.

Todos os certificados serão criados automaticamente, não sendo necessário configurar manualmente os certificados nos Brokers.

Atenção

Para que o TLS funcione corretamente, é necessário configurar o domínio no qual o deployment está sendo executado. Em ansible (Kubernetes) isso pode ser definido na variável dojot_domain_name e em docker-compose na variável DOJOT_DOMAIN_NAME em .env. Em ansible (Kubernetes) você pode desativar o modo não seguro alterando a variável dojot_insecure_mode para false e em docker-compose desmapeando a porta 1883 no serviço iotagent-mqtt. Verifique o Guia de instalação para mais informações.

5.2. Como conectar um dispositivo com o IotAgent VerneMQ

Atenção

Em primeiro lugar, você precisará de um ambiente da dojot em execução. Depois, será necessário criar o dispositivo na dojot (or usar um que já existe) e obter seu ID.

5.2.1. Recuperando certificado para um dispositivo

Para um dispositivo se conectar usando MQTT sobre TLS (MQTTS), ele deve possuir:

  • Um par de chaves (arquivo .key);

  • Um certificado assinado por uma Autoridade de Certificação (CA) confiável pela dojot (arquivo .crt);

  • O certificado desta CA (arquivo .crt);

O objetivo ao recuperar o certificado para um dispositivo é obter estes três arquivos: o certificado do dispositivo, o par de chaves do dispositivo e o certificado da CA.

Existem duas ferramentas para facilitar a obtenção de certificados na plataforma dojot:

Além disso, você pode usar o OpenSSL para criar certificados e assinar usando a API - x509-identity-mgmt, veja mais em X.509 Identity Management.

5.2.1.1. Uma breve explicação de como usar CertReq

Como pré-requisitos, ele usa git, OpenSSL, curl e jq.

Nota

You need to enable the dev-test-cli client in the keycloak. For security reasons it is disabled by default, after use it is recommended to disable it again Como habilitar e desabilitar o cliente dev-test-cli.

Em distribuições Linux baseadas em Debian, você pode instalar esses pré-requisitos executando:

sudo apt install git curl jq openssl

Baixe CertReq em sua máquina diretamente do repositório dojot e mude para a versão correspondente do seu ambiente dojot:

git clone https://github.com/dojot/dojot.git
cd dojot
git checkout v0.8.0

Entre no diretório certreq:

cd tools/certreq

Finalmente, você pode executar o script para gerar certificados e chaves da seguinte maneira:

./bin/certreq.sh \
   -h http://localhost \
   -p 8000 \
   -i 'a1998e' \
   -t 'admin' \
   -u 'admin' \
   -s 'admin'

Dado um nome de usuário admin, uma senha admin e um tenant admin, este comando irá solicitar um certificado com ID do dispositivo (identificador) a1998e para a plataforma dojot no host http://localhost na porta 8000.

Nota

Para mais detalhes sobre os parâmetros do CertReq, verifique o documento CertReq - Parameters. Outros recursos úteis para este assunto são o tutorial How to connect a device with the IoTAgent-VerneMQ with mutual TLS e a documentação do CertReq.

E no final esta ferramenta irá criar os diretórios ./ca e ./cert_{DISPOSTIVO_ID} para armazenar os certificados e chaves públicas/privadas.

5.2.2. Simulando um dispositivo com mosquitto

Vamos usar mosquitto para simular um dispositivo; ele publicará e subscreverá na dojot via MQTT.

Antes de continuar, instale o mosquitto_pub e mosquitto_sub do pacote mosquitto-clients em distribuições Linux baseadas no Debian:

Atenção

Algumas distribuições Linux, distribuições Linux baseadas em Debian em particular, tem dois pacotes para mosquitto um contendo ferramentas para cliente (ou seja, mosquitto_pub e mosquitto_sub para publicar mensagens e se subscrever a tópicos) e outro contendo o Broker MQTT também. Neste tutorial, apenas as ferramentas do pacote mosquitto-clients serão utilizadas. Verifique se um outro Broker MQTT não está em execução antes de iniciar a dojot (executando comandos como ps aux | grep mosquitto) para evitar conflitos de porta.

Em distribuições Linux baseadas em Debian, você pode instalar mosquitto-clients executando:

sudo apt-get install mosquitto-clients

5.2.2.1. IotAgent VerneMQ (Padrão)

Para publicar e subscrever usando os certificados apropriados, você deve ter IotAgent VerneMQ Broker, V2K Bridge, K2V Bridge e o X.509 Identity Management em execução, veja mais em IotAgent-VerneMQ.

Simulando uma publicação de dispositivo com mosquitto

mosquitto_pub  -h localhost -p 8883 -t <tenant>:<deviceId>/attrs  -m '{"attr_example": 10}' --cert <device .crt file> --key <device .key file> --cafile <ca .crt file>

Um exemplo de publicação com os certificados e chaves gerados no tópico anterior com a ferramenta CertReq.

mosquitto_pub \
-h localhost \
-p 8883 \
-t admin:a1998e/attrs \
-m '{"attr_example": 10 }' \
--cert './cert_a1998e/cert.pem' \
--key './cert_a1998e/private.key' \
--cafile './ca/ca.pem'

Simulando um dispositivo subscrevendo com mosquitto

mosquitto_sub  -h localhost -p 8883 -t <tenant>:<deviceId>/config  --cert <device .crt file> --key <device .key file> --cafile <ca .crt file>

Para obter mais detalhes sobre como simular um dispositivo, consulte Simulating a device with mosquitto e mais sobre simular um dispositivo com segurança em Simulating a device with mosquitto with security.

5.2.2.2. IotAgent Mosca (Legado)

Para publicar e subscrever usando os certificados apropriados, você deve estar com o IotAgent Mosca Broker e o X.509 Identity Management em execução, veja mais em IotAgent-Mosca. Além disso, você precisa usar um tópico diferente do VerneMQ e passar o identificador para publicar e subscrever, da seguinte maneira:

Como publicar:

mosquitto_pub  -h localhost -p 8883 -t /<tenant>/<deviceId>/attrs -i <tenant>:<deviceId> -m '{"attr_example": 10}' --cert <device .crt file> --key <device .key file> --cafile <ca .crt file>

Como se subscrever:

mosquitto_sub  -h localhost -p 8883 -t /<tenant>/<deviceId>/config -i <tenant>:<deviceId> --cert <device .crt file> --key <device .key file> --cafile <ca .crt file>

Nota

Nestes exemplos, a mensagem publicada possui o atributo attrs_example. Você precisa alterar para os atributos do seu dispositivo.

5.2.3. Modo inseguro do MQTT (sem TLS)

Atenção

MQTT sem segurança não é recomendado, use-o apenas para teste.

5.3. Como ler um certificado

Um arquivo de certificado pode estar em dois formatos: PEM (texto base64) ou DER (binário). OpenSSL oferece ferramentas para ler esses formatos:

Como ler um certificado:

openssl x509 -noout -text -in certFile.crt

Obtendo a fingerprint do certificado:

openssl x509 -in certFile.crt -noout -fingerprint -sha256