
Um proxy MITM local que permite controlar fingerprints de TLS (JA3/JA4), fingerprints de HTTP/2, a ordem dos cabeçalhos HTTP e o User-Agent — tudo a partir de um único arquivo de configuração YAML.
Um proxy MITM local que permite controlar impressões digitais TLS (JA3/JA4), impressões digitais HTTP/2, a ordem dos cabeçalhos HTTP, o User-Agent e os cabeçalhos de IP de origem — tudo a partir de um único arquivo de configuração YAML.
Uma extensão do Chrome está incluída para alternar o proxy e trocar perfis de impressão digital diretamente da barra de ferramentas do navegador, sem reiniciar o proxy.
Destinado a testes de segurança autorizados de sistemas de detecção de bots em WAFs. Encaminhe curl, navegadores ou Playwright através do proxy para observar como diferentes combinações de impressões digitais são classificadas.
curl / browser / Playwright
│ HTTP CONNECT (to proxy)
▼
┌─────────────────────────────────────────┐
│ impersonate-proxy │
│ │
│ MITM TLS ◄──────────────► uTLS │
│ (our CA cert) (custom JA3/4) │
│ │
│ Header rewriter (UA, order, add/del) │
│ HTTP/2 framer (SETTINGS, WINDOW_UPDATE│
│ pseudo-header order) │
└─────────────────────────────────────────┘
│ Custom TLS ClientHello + HTTP/2
▼
Target server / WAF
| Camada | O que você pode controlar |
|---|---|
| TLS | Conjuntos de cifras, extensões, sua ordem (JA3 / JA4) via presets uTLS ou uma especificação custom_hello totalmente personalizada |
| HTTP/1.1 | Ordem dos cabeçalhos, User-Agent, adicionar/remover qualquer cabeçalho, falsificação de IP (X-Forwarded-For / True-Client-IP) |
| HTTP/2 | Valores e ordem de SETTINGS, WINDOW_UPDATE, ordem dos pseudo-cabeçalhos (fingerprint HTTP/2) |
brew install go
O Go empacotado pela distro costuma estar desatualizado. Instale o binário oficial diretamente:
# Download and extract (replace 1.22.5 with the latest from https://go.dev/dl/)
curl -OL https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
# Add to PATH (add this line to ~/.bashrc or ~/.zshrc to make it permanent)
export PATH=$PATH:/usr/local/go/bin
Verificar:
go version
# go version go1.22.5 linux/amd64
ARM64 (Raspberry Pi, AWS Graviton, etc.): substitua
linux-amd64porlinux-arm64na URL de download.
Prefere um ambiente descartável em vez de instalar o Go? Vá direto para Docker.
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
make build
A CA é gerada automaticamente na primeira execução. Inicie o proxy uma vez para criar ca.crt e ca.key:
make run
# 2026/04/22 12:00:00 generated CA certificate → ca.crt
# 2026/04/22 12:00:00 listening on 127.0.0.1:8080 preset=chrome
Pare com Ctrl-C.
Os clientes precisam confiar na sua CA MITM para que não rejeitem os certificados folha gerados pelo proxy.
Keychain do sistema macOS (afeta todos os aplicativos):
make trust-ca # runs: sudo security add-trusted-cert ...
Confiança do sistema Linux (afeta todos os aplicativos; requer o pacote ca-certificates):
# Debian / Ubuntu
sudo cp ca.crt /usr/local/share/ca-certificates/impersonate-proxy.crt
sudo update-ca-certificates
# RHEL / Fedora / Amazon Linux
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/impersonate-proxy.crt
sudo update-ca-trust
somente curl (sem alteração em todo o sistema):
curl --cacert ca.crt ...
Playwright / Node.js:
export NODE_EXTRA_CA_CERTS="$(pwd)/ca.crt"
Firefox: Preferências → Privacidade e Segurança → Ver Certificados → Autoridades → Importar ca.crt
Execute o proxy em um contêiner — não é necessária instalação local de Go/Make.
Somente Linux: o contêiner é executado como um usuário sem privilégios (
nonroot, UID 65532) e precisa de acesso de escrita ao diretório./dataque contém o certificado/chave da CA. Se./dataainda não existir, o Docker o cria automaticamente com proprietárioroote sem acesso de escrita para outros usuários, então o contêiner falhará ao gerar a CA na primeira execução. Crie-o com o proprietário correto antecipadamente:mkdir -p data && sudo chown 65532:65532 dataNão é necessário no Docker Desktop para Mac/Windows — sua camada de bind-mount mapeia a propriedade automaticamente.
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
docker compose up -d
Isso compila a imagem localmente e inicia o contêiner. Na primeira execução, gera a CA do MITM e imprime:
impersonate-proxy | generated CA certificate → /data/ca.crt (add to OS trust store to avoid cert errors)
impersonate-proxy | listening on 0.0.0.0:8080 preset=chrome
Ou, para executar a imagem pré-construída diretamente sem clonar:
docker run -d --name impersonate-proxy \
-p 127.0.0.1:8080:8080 -p 127.0.0.1:8081:8081 \
-v "$(pwd)/config.docker.yaml:/config.yaml:ro" \
-v "$(pwd)/data:/data" \
ghcr.io/ytkoka/impersonate-proxy:latest
docker-compose.yml publica ambas as portas apenas em 127.0.0.1 — a mesma exposição somente via loopback de uma instalação nativa (a API de gerenciamento não possui autenticação, portanto não altere isto para 0.0.0.0 sem adicionar seu próprio controle de acesso).
A CA é gerada dentro do contêiner, mas é persistida em ./data/ca.crt e ./data/ca.key no host por meio do volume montado via bind, de modo que sobrevive a reinicializações/reconstruções do contêiner. Confie nela exatamente como na configuração nativa acima, apenas apontando para ./data/ca.crt em vez de ./ca.crt:
# curl
curl --proxy http://127.0.0.1:8080 --cacert ./data/ca.crt https://tls.peet.ws/api/all
# macOS system keychain
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ./data/ca.crt
Edite config.docker.yaml (não config.yaml — esse arquivo é para a instalação nativa) e reinicie:
docker compose restart
config.docker.yaml é idêntico ao config.yaml, exceto que listen/mgmt_listen são 0.0.0.0 (necessário para que a publicação de portas do Docker consiga alcançar o processo — o 127.0.0.1 do próprio container é inacessível a partir do host) e ca_cert/ca_key apontam para /data, o volume persistido. Consulte Configuration abaixo para todos os campos disponíveis.
| Target | Descrição |
|---|---|
make docker-build | Compila a imagem via docker compose build |
make docker-run | Compila e inicia em segundo plano |
make docker-stop | Para e remove o container |
docker compose down # stop the container
rm -rf data # also remove the persisted CA (re-trust required after)
Edite config.yaml antes de iniciar o proxy. Todos os campos têm valores padrão — você só precisa especificar o que deseja substituir.
listen: "127.0.0.1:8080"
mgmt_listen: "127.0.0.1:8081" # management API used by the Chrome extension (empty to disable)
ca_cert: "ca.crt"
ca_key: "ca.key"