
एक स्थानीय MITM प्रॉक्सी जो आपको TLS फ़िंगरप्रिंट्स (JA3/JA4), HTTP/2 फ़िंगरप्रिंट्स, HTTP हेडर क्रम, और User-Agent नियंत्रित करने देता है — सब कुछ एक ही YAML कॉन्फ़िग फ़ाइल से।
एक स्थानीय MITM प्रॉक्सी जो आपको TLS फ़िंगरप्रिंट (JA3/JA4), HTTP/2 फ़िंगरप्रिंट, HTTP हेडर क्रम, User-Agent, और स्रोत IP हेडर को नियंत्रित करने देता है — यह सब एक ही YAML कॉन्फ़िग फ़ाइल से।
प्रॉक्सी को पुनः आरंभ किए बिना सीधे ब्राउज़र टूलबार से प्रॉक्सी को टॉगल करने और फ़िंगरप्रिंट प्रोफ़ाइल स्विच करने के लिए एक Chrome एक्सटेंशन शामिल है।
यह WAF बॉट-डिटेक्शन सिस्टम के अधिकृत सुरक्षा परीक्षण के लिए है। विभिन्न फ़िंगरप्रिंट संयोजनों को कैसे वर्गीकृत किया जाता है, यह देखने के लिए curl, ब्राउज़र, या Playwright को प्रॉक्सी के माध्यम से रूट करें।
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
| परत | आप क्या नियंत्रित कर सकते हैं |
|---|---|
| TLS | सिफर सूट, एक्सटेंशन, उनका क्रम (JA3 / JA4) uTLS प्रीसेट या पूरी तरह से कस्टम custom_hello स्पेक के माध्यम से |
| HTTP/1.1 | हेडर क्रम, User-Agent, कोई भी हेडर जोड़ें/हटाएं, IP स्पूफिंग (X-Forwarded-For / True-Client-IP) |
| HTTP/2 | SETTINGS मान और क्रम, WINDOW_UPDATE, छद्म-हेडर क्रम (HTTP/2 फिंगरप्रिंट) |
brew install go
डिस्ट्रो-पैकेज्ड Go अक्सर पुराना होता है। आधिकारिक बाइनरी सीधे इंस्टॉल करें:
# 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
सत्यापित करें:
go version
# go version go1.22.5 linux/amd64
ARM64 (Raspberry Pi, AWS Graviton, आदि): डाउनलोड URL में
linux-amd64कोlinux-arm64से बदलें।
Go इंस्टॉल करने के बजाय एक डिस्पोज़ेबल एनवायरनमेंट पसंद करते हैं? सीधे Docker पर जाएँ।
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
make build
CA पहली बार चलाने पर स्वचालित रूप से जनरेट होता है। ca.crt और 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
Ctrl-C से इसे रोकें।
क्लाइंट्स को आपके MITM CA पर भरोसा करना होगा ताकि वे प्रॉक्सी द्वारा जनरेट किए गए लीफ प्रमाणपत्रों को अस्वीकार न करें।
macOS सिस्टम कीचेन (सभी ऐप्स पर प्रभाव डालता है):
make trust-ca # runs: sudo security add-trusted-cert ...
Linux सिस्टम ट्रस्ट (सभी ऐप्स को प्रभावित करता है; 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
केवल curl (कोई सिस्टम-व्यापी परिवर्तन नहीं):
curl --cacert ca.crt ...
Playwright / Node.js:
export NODE_EXTRA_CA_CERTS="$(pwd)/ca.crt"
Firefox: Preferences → Privacy & Security → View Certificates → Authorities → Import ca.crt
प्रॉक्सी को एक कंटेनर में चलाएँ — स्थानीय Go/Make इंस्टॉल की आवश्यकता नहीं।
केवल Linux: कंटेनर एक गैर-विशेषाधिकार प्राप्त उपयोगकर्ता (
nonroot, UID 65532) के रूप में चलता है और इसे./dataनिर्देशिका तक लिखने की पहुँच चाहिए जिसमें CA प्रमाणपत्र/कुंजी रखी जाती है। यदि./dataअभी तक मौजूद नहीं है, तो Docker इसे स्वचालित रूप सेrootके स्वामित्व में बनाता है और अन्य उपयोगकर्ताओं के लिए कोई लेखन पहुँच नहीं होती, इसलिए कंटेनर पहली बार चलाने पर CA उत्पन्न करने में विफल हो जाएगा। इसे पहले से सही स्वामी के साथ बनाएँ:mkdir -p data && sudo chown 65532:65532 dataMac/Windows के लिए Docker Desktop पर इसकी आवश्यकता नहीं है — इसकी बाइंड-माउंट परत स्वामित्व को स्वचालित रूप से मैप करती है।
git clone https://github.com/ytkoka/impersonate-proxy.git
cd impersonate-proxy
docker compose up -d
यह इमेज को स्थानीय रूप से बनाता है और कंटेनर शुरू करता है। पहली बार चलाने पर यह MITM CA उत्पन्न करता है और प्रिंट करता है:
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
या, बिना क्लोन किए सीधे पहले से बनी इमेज चलाने के लिए:
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 दोनों पोर्ट को केवल 127.0.0.1 पर प्रकाशित करता है — नेटिव इंस्टॉल की तरह ही केवल-लूपबैक एक्सपोज़र (मैनेजमेंट API में कोई प्रमाणीकरण नहीं है, इसलिए अपना स्वयं का एक्सेस नियंत्रण जोड़े बिना इसे 0.0.0.0 में न बदलें)।
CA कंटेनर के अंदर उत्पन्न होता है लेकिन बाइंड-माउंटेड वॉल्यूम के माध्यम से होस्ट पर ./data/ca.crt और ./data/ca.key में बना रहता है, इसलिए यह कंटेनर के पुनः आरंभ/पुनर्निर्माण के बाद भी बना रहता है। ऊपर दिए गए नेटिव सेटअप की तरह ही इस पर भरोसा करें, बस ./ca.crt के बजाय ./data/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
config.docker.yaml को संपादित करें (config.yaml नहीं — वह फ़ाइल नेटिव इंस्टॉल के लिए है) और पुनः आरंभ करें:
docker compose restart
config.docker.yaml, config.yaml के समान ही है, सिवाय इसके कि listen/mgmt_listen 0.0.0.0 हैं (Docker के पोर्ट प्रकाशन के लिए आवश्यक है ताकि वह प्रक्रिया तक पहुँच सके — कंटेनर का अपना 127.0.0.1 होस्ट से अगम्य है) और ca_cert/ca_key /data की ओर इंगित करते हैं, जो परसिस्टेड वॉल्यूम है। सभी उपलब्ध फ़ील्ड के लिए नीचे Configuration देखें।
| लक्ष्य | विवरण |
|---|---|
make docker-build | docker compose build के माध्यम से इमेज बनाएँ |
make docker-run | बैकग्राउंड में बनाएँ और प्रारंभ करें |
make docker-stop | कंटेनर को रोकें और हटाएँ |
docker compose down # stop the container
rm -rf data # also remove the persisted CA (re-trust required after)
प्रॉक्सी शुरू करने से पहले config.yaml को संपादित करें। सभी फ़ील्ड में डिफ़ॉल्ट मान हैं — आपको केवल वही निर्दिष्ट करना होगा जिसे आप ओवरराइड करना चाहते हैं।
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"
tls:
# TLS fingerprint preset (controls JA3 / JA4)
# Options: chrome | firefox | safari | edge | ios | random | golang
preset: "chrome"