Objetivo
Como mencionado nos outros tutoriais de MQTT: Introdução ao MQTTe Segurança no MQTT, manter a segurança de uma comunicação é muito importante para proteção dos dados que estão sendo transmitidos, em razão disso, esse tutorial trabalhará com o modo TLS do protocolo MQTT, além da geração de certificados de segurança. O processo de ensino será dividido nos seguintes tópicos:
Objetivos do Protocolo SSL/TLS
O que é um Certificado Digital?
O que é um OpenSSL e como baixar?
Como gerar uma Autoridade de Certificação?
Como criar um Certificado de Segurança do Servidor?
Para acompanhar esse tutorial é necessário que você tenha visto os outros dois tutoriais anteriores, pois trabalharemos com conhecimentos adquiridos previamente, além de utilizarmos a ferramenta MQTTBox, apresentada em: Introdução ao MQTT
Introdução
Desde os primórdios da internet, os protocolos TLS e seu antecessor, SSL, possibilitam a transmissão de mensagens criptografadas, garantindo dessa forma a segurança dos usuários. Frequentemente esses protocolos são atualizados com a intenção de aumentar a segurança que visa proteger o sistema de invasores e a integridade dos dados. É comum o uso do TLS em aplicativos de navegação, e-mails, troca de mensagens, entre outras aplicações com o uso de dados pessoais.
Protocolo SSL
Os protocolos são padronizações para troca de informações entre máquinas. O protocolo SSL (Secure Sockets Layer) foi desenvolvido em julho de 1994 pela Netscape e distribuído junto aos navegadores Netscape e Internet Explorer. Nos anos posteriores, foi criado o SSL 1.0, mas o mesmo não foi lançado ao público, posteriormente foi apresentado o SSL 2.0 com diversas falhas. A versão reformulada, lançada em 1996, serviu de pilar para o TLS, esse último mais atualizado e seguro. Apesar da substituição, é comum encontrarmos o TLS sendo chamado de SSL.
Protocolo TLS
Em 1999 foi lançado o TLS (Transport Layer Security), responsável por criptografar o tráfego da web e outros. Diferentemente do SSL, o TLS faz uso do algoritmo Keyed-Hashing for Message Authentication Code (HMAC), enquanto o SSL se utiliza apenas do Message Authentication Code (MAC). O HMAC produz hashes mais seguros. No TLS, não é estritamente necessário recorrer a uma raiz AC (Autoridade Certificadora e Registradora) para uso de uma certificação, sendo possível recorrer a uma autoridade intermediária, outra vantagem é o uso de novas mensagens de alerta.
Objetivos do Protocolo SSL/TLS
Os principais objetivos do Protocolo é a segurança através do uso da criptografia, a interoperabilidade entre programadores, a extensibilidade criptográfica, com a opção de adição de novos métodos de criptografia sem a necessidade de inclusão de bibliotecas, além da eficiência relativa, que consiste em um mecanismo de armazenamento para evitar processamentos criptográficos a cada nova conexão, pois a criptografia exige alto processamento.
O SSL e o TLS fornecem um canal de comunicação seguro entre máquina-máquina ou dispositivos que fazem uso de internet ou rede interna. Um exemplo de seu uso é para proteção entre navegador e servidor, transformando um site HTTP em HTTPS, sendo que o S representa “secure”, em português, “seguro”.
Diferenças entre HTTP e HTTPS
HTTP (Hypertext Transfer Protocol) é um protocolo de comunicação utilizado para transferir dados entre usuário e servidor. Analogamente, o HTTPS possui a mesma função, com a diferença de agir sobre a camada (SSL/TLS), essa camada possibilita que os dados sejam transmitidos de forma criptografada e com garantia de autenticação de servidor através dos certificados digitais, que aprenderemos mais adiante como elaborar. Em 2017 o Google tomou a medida de classificar todos os sites HTTP como inseguros.
Para saber se um site é seguro, basta conferir se no início da URL existe um cadeado verde ou cinza, esse cadeado indica que a conexão é HTTPS, outrossim, se clicarmos nesse cadeado será possível ver a certificação desse site.
Para visualizar o certificado de segurança de um site, basta clicar no cadeado e ir em >>Certificado
O que é um Certificado Digital?
Um certificado digital é um documento virtual com uma assinatura algoritma única, dados de identificação do site, informações do emissor e período de validade, o certificado garante a autenticidade e a proteção das informações compartilhadas e é de extrema relevância para sites que exigem cadastro de usuário e inserção de dados pessoais, por essa razão, é estritamente recomendado que não sejam inseridas informações pessoais em sites não certificados . O certificado deve ser emitido por uma autoridade certificadora confiável, essa confiabilidade se baseia em uma lista nomeada de “certificadoras raiz”, no tutorial aprenderemos a simular a exigência do certificado para a nossa comunicação, além de criarmos o nosso próprio certificado para fins de teste. Abaixo está o certificado digital da Curto Circuito, o mesmo que aparece ao clicarmos em cadeado>>certificado.
Para criarmos o nosso certificado digital, é necessário que baixemos o OpenSSL.
O que é o OpenSSL e como baixar
O OpenSSL é um conjunto de recursos essenciais para o desenvolvimento de comunicação baseada nos protocolos SSL/TLS, além de ser uma biblioteca de criptografia para uso geral. O OpenSSL possui licença do tipo Apache, sendo livre para obtenção e utilização para fins comerciais e não-comerciais desde que esteja de conformidade com as licenças disponíveis no site.
Para baixar o OpenSSL, é necessário acessar o link abaixo e clicar em “Download”
https://sourceforge.net/projects/openssl/
Depois de finalizado o download, clique no arquivo e extraia para uma pasta em “Extract to”
Em seguida, escolha como destino a raiz C “C:\” e clique em “Ok”
Ao término desse processo, abra o Prompt de Comando, para tal, digite “cmd” no campo de pesquisas de sua área de trabalho e seguidamente clique em “abrir”.
Estando aberto o Prompt, realize a transferência de diretório digitando cd.. para voltar um diretório ou cd NomeDoDiretório para avançar para o diretório em questão, a intenção é acessar o OpenSSL para realizar as devidas configurações.
Depois de acessarmos o diretório do OpenSSL, abriremos a pasta bin do mesmo.
Feito isso, é necessário movimentar o arquivo openssl.cnf para um diretório acima. Vamos acessar a nossa pasta do OpenSSL , entrar em bin, copiar o arquivo “openssl.cnf” e colar fora da pasta bin, dessa forma:
Como gerar uma Autoridade de Certificação (CA)
Depois de colar, vamos iniciar o nosso processo para gerar um certificado digital, primeiramente vamos criar uma chave para simular a Autoridade Certificadora, essa autoridade é a responsável por validar o certificado, assim como o cartório valida uma assinatura.
Para fazermos isso, iremos voltar ao Prompt de Comando e digitar:
openssl genrsa -des3 –out autoridade.key 2048
Onde, genrsa é o comando para gerar o algoritmo chave do tipo RSA, também existe o tipo ECDSA, mas como é mais recomendado o uso do RSA por razões de compatibilidade, usaremos este. O –des3 se refere a senha que criaremos, definimos que a mesma será criptografada em Triple-DES. O autoridade.key é o nome do nosso arquivo gerado do tipo .key, enquanto 2048 é o tamanho do mesmo em bits.
Atentando-se ao fato de que a senha deve possuir mais de 4 caracteres e deve ser repetida para confirmação.
Depois disso criaremos um certificado para a Autoridade Certificadora, para tanto, usaremos a chave que acabamos de criar, basta colarmos o algoritmo no Prompt de Comando.
openssl req -new -x509 -days 365 -key autoridade.key -out autoridade.cer
Em req -new eu faço um requerimento de um novo certificado para a Autoridade, o -x509 corresponde a um padrão que define o formato dos certificados. Um certificado x509 conta com a identidade de uma organização e é assinado por uma autoridade certificadora. Em -days eu defini a validade do meu certificado para 1 ano. Com o algoritmo -key eu inseri minha chave gerada com o nome de autoridade.key e defini o nome do meu certificado para autoridade.cer
Ao pressionar “Enter”, teremos que fornecer alguns dados para a emissão do certificado, esses dados são:
Se acessarmos a pasta OpenSSL>>Bin, veremos o nosso certificado e os seus parâmetros.
Note que o “é” do “Note-Técnico” não aparece por se tratar de um caractere especial, de qualquer forma, é importante colocar o nome exato da sua máquina, mesmo que esta tenha caracteres especiais.
Como criar um Certificado de Segurança do Servidor
Seguidamente, criaremos a chave destinada ao servidor, copie e cole o seguinte código no Prompt de Comando:
openssl genrsa -out servidor.key 2048
O servidor.key é o arquivo do tipo .key que criaremos
Depois de criarmos o par de chaves para o servidor, criaremos a requisição do certificado com o seguinte código:
openssl req -new -out servidor.csr -key servidor.key
o servidor.csr é o nosso arquivo .crs de requerimento de certificado, e o servidor.key é o nosso arquivo chave gerado no passo anterior, nesse código estamos requerindo –req uma nova -new saída –out do tipo crs.
Para preenchimento dos dados, usaremos como base o que fizemos ao criar a requisição do certificado da Autoridade, sendo fundamental usar o nome do computador ou o IP, o mesmo utilizado no “Common Name” para gerar o certificado da Autoridade Certificadora.
Ao término do requerimento, usaremos a chave da Autoridade Certificadora para validar o nosso certificado de servidor, insira o seguinte código no prompt de comando:
openssl x509 -req -in servidor.csr -CA autoridade.cer -CAkey autoridade.key -CAcreateserial -out servidor.crt -days 365
Inserimos a requisição de certificado por parte do emissor em -req -in servidor.csr, carregamos o arquivo de certificado da autoridade -CA autoridade.crt, em seguida carregamos o arquivo de chave da autoridade -CAkey autoridade.key e criamos o arquivo servidor.crt com validade de um ano -days 365
É realizada a assinatura do certificado do servidor, perceba que as informações inseridas são confirmadas.
Depois disso, é necessário obter a Fingerprint (assinatura) do servidor, para isso precisamos inserir no prompt o código:
openssl x509 -in servidor.crt -sha1 -noout -fingerprint
-sha1 é um algoritmo de dispersão seguro, apresentando maior segurança do que sua versão anterior SHA-0.
Depois de finalizado esse processo, faremos as configurações no Broker para exigência de certificado.
Para tanto, usaremos os seguintes arquivos criados:
autoridade.cer, servidor.crt e servidor.key
Todos esses arquivos estão na pasta bin do OpenSSL, devemos recortar os necessários e colar na nossa pasta Mosquitto, como mostrado abaixo:
Depois de colar os arquivos na pasta mosquitto, vamos abrir o mosquitto.conf com o Notepad++ para realizarmos as modificações necessárias.
Pressione Ctrl+F e realize uma busca por “port to use”
Devemos desmarcar port como comentário, tirando a cerquilha (#) e definindo a porta como 8883, pois a mesma é destinada para uso do MQTT sobre o SSL.
Em seguida, realizaremos uma nova busca por “cafile”
E na quarta ocorrência do cafile, tiraremos o cerquilha (#) e colocaremos o endereço do arquivo de certificado da Autoridade Certificadora.
Faremos o mesmo com os comentários abaixo, apagaremos o cerquilha (#) e colocaremos o endereço do certificado do servidor e da chave do mesmo.
Continuaremos realizando as mudanças, devemos buscar por tls_version
Mudaremos para a versão de acordo, no meu caso é a 1.2
Finalizando esse processo, devemos salvar as modificações no arquivo.
Voltaremos ao nosso prompt e iniciaremos a nossa conexão com certificado.
Digitaremos cd.. até atingirmos a raíz C:\
Depois usaremos cd para acessarmos o diretório CC_Mosquitto.
Em seguida executaremos o mosquitto com o novo arquivo de configuração, digitando:
mosquitto -v -c mosquitto.conf
Atente-se ao fato de que o mosquitto foi aberto utilizando a porta 8883, sendo as outras mensagens referentes a um cliente que já foi conectado previamente para teste.
Agora abriremos o MQTTBox para configurarmos o cliente para a comunicação segura.
Como ensinado no tutorial anterior, criaremos um novo cliente no MQTTBox.
Identificaremos o cliente para distinção entre clientes criados no MQTTBox.
Em seguida modificaremos o protocolo, dessa vez estamos trabalhando com o mqtts/tls.
Deixaremos o reconhecimento de versão do SSL/TLS (SSL/TLS version) no automático (auto). E nos identificaremos com nome (username) e senha (password) que criamos no tutorial passado.
Em host colocaremos o common-name que definimos no momento que estávamos gerando o certificado, ou seja, o nome do nosso computador.
No SSL/TLS Connection Type, definiremos a conexão para certificado do servidor assinado pela autoridade certificadora (CA signed server certificate)
As outras configurações são opcionais, depois de feitas todas as mudanças, salve.
Aguarde até que o cliente seja conectado, abaixo podemos ver que a conexão é do tipo mqtts://
Se desejar, realize inscrições e publicações como ensinado nos tutoriais anteriores, continuaremos trabalhando com o MQTT nos nossos próximos tutoriais.
Conclusão
Diante das diversas medidas de segurança apresentadas nos tutoriais anteriores e neste, é possível constatar que o MQTT é uma forma de comunicação extremamente segura e que oferece diversas alternativas para manter a privacidade dos dados compartilhados. Uma comunicação MQTTS tem o diferencial de ser um MQTT que conta com um certificado de autenticação, garantindo a criptografia das informações inseridas e a integridade do servidor, sendo de todas as formas explanadas, a mais confiável. Depois de aprendermos de forma minuciosa sobre segurança do MQTT, vamos trabalhar melhor a troca de informações nos próximos tutoriais.
Abraços, Equipe Curto Circuito