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.
Índice
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:
O script CertReq .
Utilitário de geração de certificado embutido da GUI (mais detalhes em Gerando certificados para dispositivos).
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