
Ein lokaler MITM-Proxy, mit dem du TLS-Fingerprints (JA3/JA4), HTTP/2-Fingerprints, die HTTP-Header-Reihenfolge und den User-Agent steuern kannst — alles aus einer einzigen YAML-Konfigurationsdatei.
Ein lokaler MITM-Proxy, mit dem du TLS-Fingerabdrücke (JA3/JA4), HTTP/2-Fingerabdrücke, die Reihenfolge der HTTP-Header, den User-Agent und Source-IP-Header steuern kannst – alles über eine einzige YAML-Konfigurationsdatei.
Eine Chrome-Erweiterung ist enthalten, mit der du den Proxy ein- und ausschalten und Fingerprint-Profile direkt über die Browser-Symbolleiste wechseln kannst, ohne den Proxy neu zu starten.
Gedacht für autorisierte Sicherheitstests von WAF-Bot-Erkennungssystemen. Leite curl, Browser oder Playwright durch den Proxy, um zu beobachten, wie verschiedene Fingerprint-Kombinationen klassifiziert werden.
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
| Ebene | Was Sie steuern können |
|---|---|
| TLS | Cipher-Suites, Erweiterungen, deren Reihenfolge (JA3 / JA4) über uTLS-Presets oder eine vollständig benutzerdefinierte custom_hello-Spezifikation |
| HTTP/1.1 | Header-Reihenfolge, User-Agent, beliebige Header hinzufügen/entfernen, IP-Spoofing (X-Forwarded-For / True-Client-IP) |
| HTTP/2 | SETTINGS-Werte & -Reihenfolge, WINDOW_UPDATE, Pseudo-Header-Reihenfolge (HTTP/2-Fingerabdruck) |
brew install go
Das von der Distribution mitgelieferte Go ist oft veraltet. Installiere die offizielle Binärdatei direkt:
# 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
Überprüfen:
go version
# go version go1.22.5 linux/amd64
ARM64 (Raspberry Pi, AWS Graviton usw.): ersetzen Sie
linux-amd64durchlinux-arm64in der Download-URL.
Bevorzugen Sie eine Wegwerf-Umgebung, anstatt Go zu installieren? Springen Sie direkt zu Docker.
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
make build
Die CA wird beim ersten Start automatisch generiert. Starten Sie den Proxy einmal, um ca.crt und ca.key zu erstellen:
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
Mit Ctrl-C beenden.
Clients müssen Ihrer MITM-CA vertrauen, damit sie die vom Proxy generierten Endzertifikate nicht ablehnen.
macOS-Systemschlüsselbund (betrifft alle Apps):
make trust-ca # runs: sudo security add-trusted-cert ...
Vertrauen des Linux-Systems (betrifft alle Apps; erfordert das Paket 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
nur curl (keine systemweite Änderung):
curl --cacert ca.crt ...
Playwright / Node.js:
export NODE_EXTRA_CA_CERTS="$(pwd)/ca.crt"
Firefox: Einstellungen → Datenschutz & Sicherheit → Zertifikate anzeigen → Zertifizierungsstellen → ca.crt importieren
Führe den Proxy in einem Container aus – keine lokale Go/Make-Installation erforderlich.
Nur Linux: Der Container läuft als unprivilegierter Benutzer (
nonroot, UID 65532) und benötigt Schreibzugriff auf das Verzeichnis./data, das das CA-Zertifikat und den Schlüssel enthält. Falls./datanoch nicht existiert, erstellt Docker es automatisch mit dem Eigentümerrootund ohne Schreibzugriff für andere Benutzer, sodass der Container beim ersten Start die CA nicht generieren kann. Erstelle es vorher mit dem richtigen Eigentümer:mkdir -p data && sudo chown 65532:65532 dataUnter Docker Desktop für Mac/Windows nicht erforderlich – dessen Bind-Mount-Schicht ordnet die Eigentümerschaft automatisch zu.
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
docker compose up -d
Dies baut das Image lokal und startet den Container. Beim ersten Lauf wird die MITM-CA generiert und ausgegeben:
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
Oder um das vorgefertigte Image direkt auszuführen, ohne zu klonen:
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 veröffentlicht beide Ports nur auf 127.0.0.1 — dieselbe ausschließlich auf Loopback beschränkte Exposition wie bei einer nativen Installation (die Management-API hat keine Authentifizierung, daher sollte dies nicht auf 0.0.0.0 geändert werden, ohne eine eigene Zugriffskontrolle hinzuzufügen).
Die CA wird innerhalb des Containers generiert, aber über das bind-gemountete Volume auf dem Host unter ./data/ca.crt und ./data/ca.key persistiert, sodass sie Container-Neustarts/-Rebuilds übersteht. Stufen Sie sie genau wie in der nativen Einrichtung oben als vertrauenswürdig ein, nur dass Sie statt ./ca.crt auf ./data/ca.crt verweisen:
# 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
Bearbeiten Sie config.docker.yaml (nicht config.yaml — diese Datei ist für die native Installation) und starten Sie neu:
docker compose restart
config.docker.yaml ist identisch mit config.yaml, außer dass listen/mgmt_listen auf 0.0.0.0 gesetzt sind (erforderlich, damit Dockers Portveröffentlichung den Prozess überhaupt erreichen kann — das eigene 127.0.0.1 des Containers ist vom Host aus nicht erreichbar) und ca_cert/ca_key auf /data verweisen, das persistierte Volume. Siehe Konfiguration unten für alle verfügbaren Felder.
| Ziel | Beschreibung |
|---|---|
make docker-build | Erstellt das Image über docker compose build |
make docker-run | Erstellt und startet im Hintergrund |
make docker-stop | Stoppt und entfernt den Container |
docker compose down # stop the container
rm -rf data # also remove the persisted CA (re-trust required after)