Marcio Cunha

Como inspecionar tráfego HTTPS usando o mitmproxy na prática

Aprenda passo a passo como interceptar, modificar e depurar requisições HTTPS em ambientes de desenvolvimento e homologação usando a ferramenta mitmproxy.

Marcio Cunha•5 min
Também disponível em:EnglishEspañol
Resumo
  • O mitmproxy funciona como um intermediário que decodifica conexões HTTPS para inspeção em tempo real.
  • A instalação exige a geração e inclusão manual do certificado digital no sistema operacional ou navegador.
  • Modos de operação como o transparente e o proxy reverso atendem a diferentes arquiteturas de rede.
  • Scripts em Python permitem injetar falhas e alterar payloads de forma automatizada durante os testes.
  • O monitoramento de chamadas de rede acelera a correção de erros de API em ambientes locais.

Por que precisamos interceptar conexões seguras?

Quando desenvolvemos aplicações web ou móveis, a maior parte da comunicação com os servidores ocorre por meio do protocolo HTTPS, que garante a privacidade e a integridade dos dados através de criptografia de ponta a ponta. Na prática, isso significa que nem mesmo nós, desenvolvendo o sistema no computador, conseguimos enxergar facilmente quais dados estão sendo enviados pelo fio, transformando o tráfego em uma caixa-preta opaca durante a depuração. Para resolver esse dilema sem comprometer a segurança da produção, usamos ferramentas conhecidas como proxies interceptadores, capazes de descriptografar temporariamente o tráfego em um ambiente controlado de desenvolvimento.

Se você já precisou debugar um container travando ou entender o comportamento exato de uma API de terceiros, sabe que adivinhar o conteúdo de um pacote de rede é uma perda de tempo frustrante. É exatamente nesse cenário que o mitmproxy se destaca como uma alternativa de código aberto extremamente poderosa ao Charles Proxy ou ao Fiddler. Ele roda diretamente no terminal, aceita automações complexas via scripts e consome poucos recursos do computador, tornando-se indispensável para engenheiros que precisam inspecionar cabeçalhos HTTP, corpos de requisições e códigos de status em tempo real.

O que é o mitmproxy e como ele opera nos bastidores?

O mitmproxy é um conjunto de ferramentas interativas focadas na análise de tráfego HTTP e HTTPS, composto por uma interface de linha de comando interativa (mitmproxy), uma versão web amigável (mitmweb) e uma ferramenta de linha de comando para automação pura (mitmdump). Na prática, ele atua como um 'homem no meio' legítimo: o seu aplicativo envia a requisição para o mitmproxy achando que ele é o servidor final, o mitmproxy descriptografa o pacote usando um certificado próprio, lê ou altera o conteúdo, e então repassa a chamada para o destino real, repetindo o processo no caminho de volta.

Para que essa mágica aconteça sem que o sistema operacional dispare alertas de segurança intransponíveis, precisamos instalar o certificado raiz gerado pelo próprio mitmproxy na máquina de testes. Enquanto configurar IP estático no Linux garante a estabilidade da rota de rede, confiar no certificado do proxy garante que o navegador ou a aplicação aceitem a conexão intermediada sem corromper o handshake de criptografia SSL/TLS.

Passo a passo para instalar e configurar o mitmproxy

A instalação do mitmproxy pode ser feita facilmente através do gerenciador de pacotes do sistema ou via pip, o gerenciador de pacotes do Python. Vamos utilizar o ambiente de linha de comando para rodar o utilitário pela primeira vez e gerar os arquivos de configuração necessários na sua pasta de usuário.

  1. Instale o mitmproxy no seu sistema operacional executando o comando de instalação no terminal da sua máquina de desenvolvimento.
    pip install mitmproxy
  2. Inicie o mitmproxy pela primeira vez para que ele crie os certificados SSL na pasta oculta do seu diretório pessoal.
    mitmproxy
  3. Configure o seu navegador ou sistema operacional para direcionar todo o tráfego HTTP e HTTPS para o endereço local na porta padrão.
    export http_proxy='http://127.0.0.1:8080' && export https_proxy='http://127.0.0.1:8080'

Depois de executar esses passos iniciais, abra o navegador e acesse o endereço especial disponibilizado pela ferramenta para baixar o arquivo de certificado e instalá-lo no repositório confiável do seu sistema. Sem essa etapa, qualquer requisição HTTPS disparada gerará um erro fatal de certificado inválido nas aplicações monitoradas.

Inspecionando e modificando requisições em tempo real

Com o proxy rodando e os certificados devidamente aceitos, qualquer requisição feita a partir da máquina local aparecerá instantaneamente na interface do mitmproxy. Você pode navegar pelas linhas usando as setas do teclado, selecionar uma requisição específica apertando a tecla Enter para examinar detalhadamente os cabeçalhos de envio, os cookies de sessão e o payload JSON enviado no corpo da chamada POST ou PUT.

Uma das funcionalidades mais úteis durante os testes de homologação é a capacidade de pausar a requisição antes que ela chegue ao servidor de destino, permitindo alterar parâmetros cruciais manualmente para testar o comportamento do sistema diante de dados inesperados. Para quem gerencia servidores locais e precisa limpar o cache do Docker no Linux para liberar espaço em disco, monitorar o tráfego de containers através do mitmproxy revela exatamente quais requisições antigas ou corrompidas estão sendo repetidas pela aplicação.

Automatizando tarefas com scripts em Python

Quando a inspeção visual manual deixa de ser suficiente, o mitmproxy brilha ao permitir a criação de scripts em linguagem Python para interceptar e modificar o tráfego de maneira programática. Podemos escrever funções simples que escutam eventos do ciclo de vida da requisição e aplicam regras automáticas, como injetar um cabeçalho de autenticação em todas as chamadas ou simular a queda de conexão de um microsserviço.

Abaixo temos um exemplo básico de script que intercepta todas as requisições HTTP e adiciona um cabeçalho personalizado de rastreamento antes de encaminhá-las adiante:

from mitmproxy import http

def request(flow: http.HTTPFlow) -> None:
    # Adiciona um cabeçalho personalizado em todas as requisições interceptadas
    flow.request.headers["X-Debug-Inspection"] = "Ativo"
    print(f"Requisição interceptada para: {flow.request.pretty_url}")

Esse nível de programabilidade transforma o mitmproxy em um canivete suiço para testes de integração, permitindo simular cenários complexos de falhas de rede que seriam extremamente difíceis de reproduzir em um ambiente de produção real.

Considerações finais sobre a depuração segura

Dominar o uso de um proxy de interceptação como o mitmproxy muda completamente a forma como encaramos os problemas de integração entre sistemas e APIs. Ao decodificar o tráfego criptografado em ambientes controlados, eliminamos as suposições e conseguimos isolar a raiz de bugs complexos em questão de minutos, economizando horas de frustração na bancada de desenvolvimento.

Lembre-se sempre de que essas ferramentas poderosas devem ser utilizadas estritamente em contextos de desenvolvimento, testes e homologação em máquinas seguras. Nunca instale certificados de interceptação em ambientes de produção ou em dispositivos de uso pessoal sem rigoroso controle de segurança, garantindo assim a integridade dos dados e a privacidade dos usuários finais.