Criptografia em AdvPL – Parte 07

Introdução

No post anterior, configuramos um TOTVS Application Server como servidor HTTP e HTTPS, usando um certificado digital criado na raça usando a OpenSSL, do tipo “auto-assinado”, sem uma Autoridade Certificadora. Agora, aproveitando que temos um ambiente com um site que atende conexões não-seguras e seguras, vamos ver o que passa por dentro da camada de rede usando esses dois tipos de conexão.

Posts anteriores

Usando um analisador de pacotes de rede

Como temos agora um servidor configurado para conexões HTTP (Porta TCP 80) e HTTPS (Porta TCP 443), vamos ver como é possível “interceptar” a comunicação entre o navegador e o servidor HTTP usando um programa “espião de pacotes” — também chamados de Sniffer ou Network Packets Analyzer.

No caso, vou usar um analisador de rede chamado Wireshark — OpenSource, já tem Builds prontas para Windows e Linux, disponíveis no link https://www.wireshark.org/download.html — A instalação é tão simples quanto Next->I Agree->Next->Next->Next->Finish. Não vou entrar em mais detalhes desse recurso no momento, não é o foco desse post, apenas vou mostrar como o conteúdo transferido entre o servidor HTTP e o navegador pode ser visto — este é o pacote de resposta do servidor com a página HTML, usando uma conexão HTTP (não segura):

wireshark_http.png

A requisição que a imagem acima mostra é a resposta do servidor HTTP quando eu abri o navegador e pedi a página http://note-juliow-ssd.index.html. Se a gente ver o quando de informações o navegador enviou para o servidor quando pediu essa página, o Browser manda muitas informações:

GET /index.html HTTP/1.1
Host: note-juliow-ssd
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6,sv;q=0.5

As informações acima foram enviadas pelo Chrome ao servidor HTTP do Protheus quando eu pedi um “Refresh” da página Index.html.

Interceptando os pacotes de uma conexão segura

Bem, meu chapa, o analisador de pacotes de rede intercepta tudo, inclusive uma conexão segura … Você consegue ver todas as etapas de HandShake e trocas de cifras e certificados entre as partes envolvidas, e depois os pacotes de dados … mas não adianta NADA, mesmo que você intercepte TODOS os pacotes … os tipos de informações trocadas entre o navegador e o servidor também estão criptografadas, o máximo que você pode fazer é olhar para os pacotes de dados e chorar … por que somente o servidor e o navegador sabem o que tem dentro 😀

https_application_data

Por exemplo, na imagem acima vemos um dos pacotes de dados trocados entre o navegador e o servidor HTTPS … não dá pra saber se foi uma pergunta ou uma resposta, ou o que isso quer dizer … e mesmo que você consiga fazer um ataque conhecido como “Man In The Middle”, isto é, fazer esta conexão passar por um “Tunnel TCP” dentro de uma aplicação sua, se você tentar mexer em um bit desse conteúdo, a decodificação da mensagem falha e a requisição sequer será processada, a camada de segurança que encapsula a conexão retorna um erro, e tchau.

Todo esse mecanismo tem como base a chave criptográfica privada armazenada no arquivo  “note-juliow-ssd.key”, em formato codificado BASE64. Como esta chave é única, e ainda foi criada sem senha, se eu usar ela para uma comunicação segura de uma aplicação de comunicação oficial, eu já comecei errado, por várias razões.

  • Chave privada sem proteção de senha
  • Certificado emitido sem uma Autoridade Certificadora

Se alguém coloca a mão nessa chave privada, desprotegida, e ela é usada para trocas de dados importantes, é possível gerar um outro certificado com outros dados baseado nesta chave, e usá-lo por exemplo para subir um servidor que finge ser “eu” em outro endereço na internet. e usando outros artifícios, fazer um “Tunnel TCP” entre o cliente e o meu servidor verdadeiro, capaz de ver o conteúdo descriptografado das mensagens — inclusive eu pretendo fazer esse teste mais pra frente.

E, se eu perder a minha chave privada, ou ela está protegida por senha e eu esquecer a senha … e eu usei essa chave para criptografar documentos, arquivos, imagens, qualquer coisa, esquece. Sem ela nem eu consigo decodificar as informações. Por isso que foram criados até dispositivos de hardware — como o HSM — para o acesso e uso controlado e restrito destas chaves. A segurança dessas chaves é criada de tal forma, que é possível saber que a senha está errada, mas não é possível determinar a senha certa.

F.A.Q.

P: O certificado foi gerado para o host  “note-juliow-ssd”, o que acontece se eu tentar acessar o HTTPS usando por exemplo https://localhost/index.html ou o IP da máquina ?

R: Como o certificado possui uma definição de DNS usando “note-automan-ssd“, se eu usar outro hostname para abrir o site, o Navegador avisa que tem algo errado — mais precisamente o erro “NET::ERR_CERT_COMMON_NAME_INVALID”

https_failed

P: Tentei abrir o endereço certinho no Mozzila, mesmo depois de importar o certificado. Por que não funcionou ?

mozilla_failedR: Repare na mensagem de erro :  MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT — O navegador Mozilla é mais restritivo, mesmo eu importando o certificado, ele avisa que trata-se de um certificado auto-assinado, mas permite continuar desde que você clique no link “Aceite o risco e continue” 😛 

P: Se eu entrar no site do Google por exemplo, digitando http://www.google.com , aparece um cadeado ?! Como ?! Eu não entrei no site com uma conexão não-segura ???

R: Sim, você entrou, o site do Google, Facebook e muitos outros possuem o acesso por HTTP (Porta 80 sem criptografia) e HTTPS (Porta 443 com criptografia). Mas, quando você entra pela conexão não segura, o site atende a conexão com HTTP, e retorna uma instrução de redirecionamento para o navegador solicitar novamente a mesma URL, porém mas usando a conexão segura. Veja por exemplo o pacote retornado pelo Google quando eu abri uma URL de pesquisa usando http://www.google.com.br/search?q=siga0984

HTTP/1.1 307 Internal Redirect
Location: https://www.google.com.br/search?q=siga0984
Non-Authoritative-Reason: HSTS

P: Como uma conexão HTTPS de um site qualquer é segura, se eu não precisei instalar na minha máquina nenhum certificado para ela funcionar ?!

R: Uma conexão segura de HTTPS exige que pelo menos uma das extremidades tenha um certificado e uma chave. No caso, os sites “abertos” como Facebook , Google e a grande maioria, usam um certificado oficial apenas no servidor, para garantir a identidade do servidor, e a chave de criptografia para codificar a conexão. O navegador acessa o certificado do servidor no “HandShake“, e com isso pode confirmar que o site que você acessou é “oficial”. Alguns sites, como os da Receita Federal, podem exigir uma autenticação por cerificado digital, como um eCPF ou eCNPJ por exemplo, que você vai usar na sua máquina, para o site conseguir determinar quem é você 😀 Não é apenas uma conexão segura e codificada, mas também permite ao servidor saber mediante o seu certificado digital quem é você, e que “você é mesmo você” 😀

Conclusão

O que vimos nestes dois últimos posts foi apenas o be-a-bá de como subir um site de testes com HTTPS. Nos próximos posts, vamos desbravar mais possibilidades desse universo.

Espero que vocês aproveitem bem e usem com sabedoria e responsabilidade estes conhecimentos, e desejo a todos como sempre TERABYTES DE SUCESSO !!! 

Referências

 

3 comentários sobre “Criptografia em AdvPL – Parte 07

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s