4. 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.

4.1. Componentes

4.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.

4.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.

4.1.2. MQTT Brokers

4.1.2.1. IotAgent VerneMQ (Padrão)

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.

Para usar IotAgent VerneMQ com TLS, você precisa configurar por variável de ambiente:

  • EXTERNAL_SERVER_HOSTNAME: O hostname/ip do servidor (o host ao qual o dispositivo se conecta externamente). Exemplo: mydomain.com. Por padrão, é localhost.

Veja outras variáveis de ambiente em VerneMQ Dojot - Environment variables.

4.1.2.2. IotAgent Mosca (Legado)

O IotAgent Mosca usa o Mosca que é um broker mqtt em node.js , veja mais sobre este serviço em IotAgent-VerneMQ. Este não é o Broker MQTT padrão em deployments dojot.

Para usar IotAgent Mosca com TLS, você precisa configurar por variável de ambiente:

  • MOSCA_TLS_DNS_LIST: O hostname/ip do servidor o host ao qual o dispositivo se conecta externamente) (separados por uma vírgula). Exemplo: localhost, mydomain.com

4.1.2.3. Sobre o uso do IotAgent VerneMQ ou IotAgent Mosca

Você não deve usar os dois brokers juntos para evitar conflitos de porta. Use VerneMQ (padrão) ou Mosca (legado). Por padrão, nossas deployments estão usando VerneMQ.

Para o deployment via Ansible (ou seja, Kubernetes) de ambos os brokers:

  • Se você definiu a variável dojot_domain_name, não precisa configurar as variáveis de ambiente mencionadas nos tópicos anteriores.

  • Você pode desabilitar o *modo não seguro * mudando a variável dojot_insecure_mode para false.

Além disso, você pode escolher entre IotAgent VerneMQ ou` IotAgent Mosca` ao configurar o deployment via Ansible (ou seja, Kubernetes). No docker-compose, você precisa descomentar e comentar os serviços no arquivo docker-compose.yml, há uma explicação comentada sobre isso neste arquivo.

Verifique o Guia de instalação para mais informações.

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

4.2. Como conectar um dispositivo com o IotAgent VerneMQ ou IotAgent Mosca com TLS mútuo

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.

4.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:

  • O script CertReq .

  • Utilitário de geração de certificado embutido da GUI (mais detalhes em A_SER_CRIADO).

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.

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

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

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.5.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 localhost \
   -p 8000 \
   -i 'a1998e' \
   -u 'admin' \
   -s 'admin'

Dado um nome de usuário admin e uma senha admin, este comando irá solicitar um certificado com ID do dispositivo (identificador) a1998e para a plataforma dojot no host 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.

4.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

4.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.

4.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.

4.2.3. Modo inseguro do MQTT (sem TLS)

Atenção

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

Em deployment via Ansible (kubernetes), você pode desabilitar o modo não seguro alterando a variável dojot_insecure_mqtt para` false`, isso é válido em ambos os brokers. Verifique Guia de instalação para mais informações.

4.2.3.1. IotAgent VerneMQ (Padrão)

Você pode desabilitar o modo inseguro se você tornar a porta 1883 indisponível para acesso externo.

Para obter mais detalhes sobre como simular um dispositivo sem segurança, verifique o tutorial Simulating a device with mosquitto without security .

4.2.3.2. IotAgent Mosca (Legado)

Você pode desabilitar o modo inseguro no Mosca mudando a variável de ambiente ALLOW_UNSECURED_MODE para 'false' ou removendo o acesso externo à porta 1883. Veja mais em IotAgent-Mosca.

4.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:

openssl x509 -noout -text -in certFile.crt