Configurando conexão segura com o uso de TLS na plataforma dojot

Este post faz parte da série Dispositivos reais e segurança na comunicação. Leia também os outros posts da série:

A dojot é uma plataforma brasileira desenvolvida principalmente pelo CPqD e que surgiu com uma proposta open source, visando facilitar o desenvolvimento de soluções e subsidiar o ecossistema IoT com conteúdo local voltado às necessidades do País.

 

O código dos componentes que compõem a solução está disponível no repositório do Github. Descritivos detalhados da arquitetura, do funcionamento dos componentes e alguns casos de uso podem ser encontrados na documentação.

 

 

Introdução

 

No artigo anterior, abordamos a configuração da comunicação entre uma Raspberry Pi e a plataforma dojot. Um ponto ainda não avaliado na comunicação é a garantia que a conversa está ocorrendo de fato entre a dojot e o correto dispositivo.

 

Visando solucionar essa questão, este artigo visa implementar a segurança dos dados trafegados a partir da encriptação das mensagens com o uso de certificados digitais.

 

Iniciaremos utilizando um dispositivo simples e enviando sinais através da linha de comando.

 

Iremos então alterar a configuração de segurança da dojot, forçando o uso de TLS em toda a comunicação MQTT.

 

Em seguida, iremos solicitar à plataforma dojot a assinatura de um novo certificado e então utilizá-lo para que comunicação seja restabelecida.

 

Por fim, seguiremos os mesmos passos para configurar a Raspberry Pi utilizada no artigo anterior, permitindo que ela também se comunique com a dojot de forma segura.

 

 

Criação do device

 

Seguindo os mesmos passos descritos na série introdutória à plataforma dojot, criamos um dispositivo diretamente pela interface gráfica, ao qual foi atribuído o device id 7b7184. Esse será o dispositivo utilizado ao longo deste artigo.

 

Dispositivo criado sob o ID 7b7184

 

No artigo de introdução também mencionamos o comando a seguir, que permite a comunicação com o broker MQTT.

 

Em destaque, o device id, que deve ser atualizado de acordo com o id gerado pelo sistema.

 

 

Note que a comunicação é realizada através da porta 1883. Essa é a porta padrão para comunicação MQTT.

 

Para casos onde a comunicação MQTT utiliza TLS, a porta padrão passa a ser a 8883.

 

 

Habilitando TLS na plataforma dojot

 

Buscando facilitar a rotina de desenvolvimento, as configurações da plataforma presentes no repositório mantêm o TLS desabilitado por padrão. Para que a comunicação possa ser realizada com o uso de TLS, precisaremos inicialmente habilitar esta funcionalidade.

 

Vá até o diretório docker-compose, baixado durante o processo de instalação, e abra o arquivo docker-compose.yml.

 

Nele, estão listados todos os contêineres utilizados pela solução.

 

Procure pelo contêiner nomeado iotagent-mqtt:

 

 

Neste trecho, estão listados quais contêineres compõem as dependências deste componente, junto com as portas que serão vinculadas ao host, o critério de inicialização, as variáveis de ambiente e as opções de log.

 

Nas variáveis de ambiente, habilite a comunicação TLS adicionando uma nova variável, conforme destacado a seguir:

 

 

Para que a modificação seja aplicada ao ambiente, execute o seguinte comando:

 

 

Aplicando as alterações de configuração.
Note que apenas os serviços afetados são reiniciados.

 

Agora, ao tentarmos conectar à porta 1883, a conexão é rejeitada.

O mesmo ocorre para conexão na 8883, pois é preciso enviar um certificado para validação de autenticidade.

 

 

Configurando um certificado para o dispositivo

 

O servidor precisa ter em sua posse o certificado digital dos dispositivos que enviarão mensagens.

 

De forma geral, a troca de mensagens é realizada com a utilização das chaves privadas de ambas as partes e suas correspondentes chaves públicas, contidas nos certificados.

 

A plataforma dojot conta com uma Autoridade Certificadora, baseada em EJBCA e denominada IOTmidCA.

 

Para obtenção do certificado, os seguintes passos devem ser seguidos:

  • Criação do par de chaves (arquivo .key)
  • Criação o pedido de certificado (arquivo .csr)
  • Obtenção do certificado junto à Autoridade Certificadora (arquivo .crt)

 

 

Para facilitar essas etapas, recomendamos a utilização da ferramenta certificate-retriever, criada exatamente para este fim. Seu código está contido neste repositório.

 

Os comandos abaixo realizam a cópia dos arquivos para o diretório local e a criação o diretório certs dentro do mesmo.

 

 

 

O script generateLoginPwd.py deve ser utilizado para obtenção do certificado assinado.

 

Neste script, são necessários os seguintes parâmetros:

 

  • host: protocolo e endereço onde a plataforma dojot está sendo executada. No nosso caso, http://localhost:8000
  • device_name: ID do dispositivo para o qual será criado o certificado. Aqui, continuaremos utilizando o dispositivo 7b7184.
  • ca_name: nome da Autoridade Certificadora. Na dojot, a CA existente leva o nome IOTmidCA.

 

Importante: o certificado só pode ser criado para deviceIDs que estejam presentes na plataforma - e, portanto, visíveis pela interface web.

 

Utilize python3 para a execução do script, enviando também os parâmetros mencionados.

 

 

As credenciais de acesso a serem utilizadas são:

  • user: admin
  • password: admin

 

O log de saída deverá exibir uma mensagem similar à listada abaixo:

 

 

 

Neste caso,o certificado foi criado em ./certs/7b7184.crt.

 

Adicionalmente, o certificado da Autoridade Certificadora foi armazenado em ./certs/IOTmidCA.crt

 

Ambos serão utilizados - em conjunto com o arquivo 7b7184.key - para a comunicação entre o client MQTT e o servidor da dojot.

 

 

Utilizando a conexão com TLS

 

Finalmente, uma vez criado o par de chaves do dispositivo e obtido o certificado, podemos realizar a comunicação utilizando TLS.

 

Para essa finalidade, utilizaremos o cliente mosquitto_pub, visando manter um nível mínimo de complexidade, facilitando assim a depuração de possíveis erros.

 

Partindo do comando anterior:

 

 

Precisaremos alterar a porta a ser utilizada, passando também os parâmetros que indiquem a localização da chave e do certificado assinado do dispositivo, juntamente com o certificado da CA.

 

Sendo assim, o comando que exemplifica essas mudanças é mostrado a seguir:

 

 

 

Note que os caminhos para o arquivo são relativos ao diretório atual, então os configure de acordo, caso esteja em um diretório diferente do ./certificate-retriever.

 

 

Utilizando um dispositivo real para comunicação com TLS

 

No artigo anterior, configuramos a utilização de uma Raspberry Pi em conjunto com o SensorHat para envio de dados de temperatura, pressão e umidade à plataforma dojot. Neste dispositivo, também recebíamos alertas nos casos de temperatura abaixo de 20ºC ou acima de 40ºC.

 

Como a plataforma dojot agora está com a configuração de TLS ativada, precisaremos configurar este dispositivo para utilizar certificado em sua comunicação.

 

Partiremos do script criado para este dispositivo e, então, o modificaremos para que o cliente realize a conexão com o broker de forma segura.

 

 

Criando o dispositivo na plataforma dojot

 

Como o modelo virtual do Raspberry Pi foi criado no artigo acima mencionado, iremos assumir que a plataforma já o possua em sua listagem de dispositivos.

 

Dispositivo criado no artigo anterior, ao qual foi atribuído o ID 36fc0a.

 

 

Criando o certificado para a Raspberry Pi

 

A partir do utilitário de configuração de certificados, podemos gerar um novo certificado para este dispositivo - lembrando que as credenciais são admin/admin.

 

 

Com isso, os seguintes arquivos serão gerados no diretório ./certs:

  • IOTmidCA.crt
  • 36fc0a.crt
  • 36fc0a.key

 

Configurando a comunicação com TLS a partir do Raspberry Pi

 

Copie os três arquivos gerados no passo anterior para um diretório da Raspberry Pi. Neste exemplo, utilizaremos o diretório /etc/ssl/certs. Caso esteja utilizando o emulador, faça referência ao path local que leva aos arquivos.

 

Será utilizado como base o script de comunicação criado no artigo anterior, onde a Raspberry Pi foi configurada para trocar dados com a dojot:

 

 

Faremos as alterações necessárias para que a conexão do cliente com o broker seja realizada utilizando os certificados criados. As linhas em destaque no trecho a seguir foram incluídas com tal finalidade. Nelas, foram inseridas as seguintes funcionalidades:

  • Importação da biblioteca para ssl.
  • Indicação do diretório de certificados.
  • Indicação dos arquivos de certificado da CA, do dispositivo e chave do dispositivo.
  • Configuração do uso de certificado na biblioteca MQTT.
  • Alteração da porta de comunicação para a 8883 - padrão para MQTT com TLS

 

 

 

Com isso, a troca de dados entre o dispositivo e a plataforma já pode ser retomada, desta vez utilizando uma via segura para comunicação.

 

 

Conclusão

 

Até aqui, foram vistos os principais procedimentos envolvendo a geração e utilização de certificados a partir da plataforma dojot. Com isso, a comunicação entre dispositivo e dojot passa a ser segura, garantindo ainda que a autoria dos dados gerados realmente é do dispositivo esperado.

 

Nas séries futuras, utilizaremos essa segurança para que então possamos integrar a plataforma dojot com uma solução de blockchain, garantindo a autenticidade do histórico das informações a partir do uso de um ledger distribuído, potencializando a auditoria de dados.

Outros artigos da série

<< Trocando informações com uma Raspberry Pi e plataforma dojot
Este post faz da série Dispositivos reais e segurança na comunicação. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Rafael Zanetti
Graduado em Engenharia Mecatrônica, atua em desenvolvimento de software com foco em soluções potencializadas por big data e inteligência artificial. Atualmente, está envolvido com IoT e suas aplicações no cenário nacional.

Deixe um comentário

avatar
 
  Notificações  
Notificar