Odcisk TLS (JA3/JA4): Dlaczego czyste IP są nadal blokowane

Twoje IP rezydencjalne jest czyste, nagłówki są idealne, a mimo to otrzymujesz 403 przy pierwszym żądaniu. Problemem jest twój uścisk dłoni TLS — odcisk palca, który systemy antybotowe odczytują przed wymianą jakichkolwiek danych HTTP.

Oto zagadka, na którą natrafia każdy scraper: IP rezydencjalne jest czyste, User-Agent to aktualny ciąg Chrome, nagłówki są w idealnym porządku — a pierwsze żądanie wraca z 403. Żadne rotacje tego nie naprawiają. Powodem jest to, że blokada nastąpiła zanim twoje nagłówki zostały przeczytane. Nowoczesne systemy antybotowe odciskają twój uścisk dłoni TLS, a domyślny klient Python, Go lub curl ogłasza się jako bot w ClientHello, jedną warstwę poniżej HTTP. To właśnie robią odciski JA3 i JA4, i dlaczego curl dostaje 403, gdzie przeglądarka dostaje 200 na identycznym URL.

Co odczytuje odcisk TLS

Każde połączenie HTTPS rozpoczyna się od uścisku dłoni TLS. Klient wysyła ClientHello, który reklamuje, w określonej kolejności, którą wersję TLS chce, które zestawy szyfrów obsługuje, które rozszerzenia oferuje (SNI, ALPN i inne), które krzywe eliptyczne i które formaty punktów. Żadne z tego nie identyfikuje bezpośrednio twojej przeglądarki — ale dokładna kombinacja i kolejność to niemal unikalny podpis stosu oprogramowania. Lista Chrome różni się od Firefox, a obie różnią się znacznie od requests Pythona lub net/http Go. Przeczytaj uścisk dłoni, a możesz zgadnąć klienta zanim zostanie wymieniony bajt HTTP.

JA3: pięć pól w jeden hash MD5

JA3, opublikowany w 2017 roku przez inżynierów Salesforce, to klasyczna metoda. Pobiera pięć pól z ClientHello — wersję TLS, szyfry, rozszerzenia, krzywe eliptyczne i formaty punktów — konkatenizuje je i przepuszcza ciąg przez MD5. Konkretny przykład: pola

771,4865-4866-4867,0-11-10-35-16-5-13,29-23-24,0

haszują się do e7d705a3286e19ea42f587b344ee6865 — odcisk palca, który należy do standardowej kompilacji curl. Dostawcy antybotowi prowadzą bazy danych tych hashów. Żądanie, którego JA3 pasuje do znanej biblioteki scrapingu, otrzymuje surowszy limit, wyzwanie lub całkowitą blokadę. Najpotężniejszym sprawdzeniem jest korelacja: jeśli twój User-Agent twierdzi, że to Chrome 120, ale twój JA3 mówi python-requests, ta sprzeczność sama w sobie wystarczy, aby cię oblać.

Dlaczego JA3 ustąpił miejsca JA4

JA3 ma słabość, która złamała go jako stabilny sygnał. Od Chrome 110 i Firefox 114, przeglądarki losowo zmieniają kolejność rozszerzeń TLS przy każdym połączeniu, aby przeciwdziałać odciskom palców. To oznacza, że prawdziwa przeglądarka teraz produkuje inny hash JA3 przy każdej sesji — więc surowy JA3 daje fałszywe alarmy na prawdziwych użytkownikach. Odpowiedzią branży jest JA3N (znormalizowana wersja, która sortuje rozszerzenia przed haszowaniem, anulując losowość) i JA4, nowszy schemat od FoxIO zbudowany przez samego twórcę JA3.

JA4 jest bardziej czytelny i trudniejszy do podrobienia. Używa układu trzyczęściowego a_b_c, na przykład t13d1516h2_8daaf6152771_e5627efa2ab1. Sam prefiks mówi wiele: t dla TCP, 13 dla TLS 1.3, d dla SNI opartego na domenie, 15 zestawów szyfrów, 16 rozszerzeń i h2 dla HTTP/2 jako pierwszego ALPN — a następnie dwa skrócone hasze posortowanych szyfrów i rozszerzeń plus algorytmy podpisu. JA4 jest jednym z rodziny: JA4S odciska serwer, JA4H nagłówki HTTP, JA4X certyfikat, a JA4T surową warstwę TCP.

Diagram pokazujący domyślnego klienta zablokowanego na uścisku dłoni TLS w porównaniu z klientem w kształcie przeglądarki przechodzącym, zanim zostanie wysłane jakiekolwiek HTTP
Wyszukiwanie JA3/JA4 odbywa się podczas uścisku dłoni — niedopasowany odcisk to 403 zanim twoje nagłówki zostaną przeczytane.

Dlaczego czyste IP cię nie ratuje

To jest część, która myli ludzi inwestujących tylko w proxy. Nienaruszone IP rezydencjalne mówi stronie, że ruch pochodzi z prawdziwej sieci. Niedopasowany uścisk dłoni TLS mówi, że ruch pochodzi ze skryptu. Kiedy te dwa sygnały się nie zgadzają, wygrywa uścisk dłoni, ponieważ jest znacznie trudniejszy do przypadkowego podrobienia. Możesz rotować przez tysiąc czystych wyjść i nadal nie uda się każde żądanie, jeśli wszystkie tysiąc mają ten sam JA3 python-requests. IP i odcisk to oddzielne osie — musisz mieć oba poprawne.

Konkretne przykłady pokazują się w wskaźnikach przejścia na cel chroniony przez Cloudflare: domyślny klient requests przechodzi około dwóch procent żądań, httpx z HTTP/2 robi to trochę lepiej, a klient dopasowany do przeglądarki przekracza osiemdziesiąt procent. Ta sama pula IP w każdym przypadku. Zmienną jest stos TLS. Akamai podnosi poprzeczkę dalej, łącząc odcisk TLS z odciskiem HTTP/2 — wartości ramki SETTINGS, rozmiary okien i priorytety strumieni — więc nawet poprawny JA3 może zostać złapany, jeśli warstwa HTTP/2 wygląda na skryptowaną. Nasza analiza dlaczego Akamai blokuje większość ruchu proxy zagłębia się w ten stos.

Wykres słupkowy wskaźników przejścia Cloudflare według klienta, od domyślnego python-requests przez httpx i curl_cffi do przeglądarek bezgłowych
To samo czyste IP w każdym przypadku — tylko stos TLS zmienia wskaźnik przejścia. Naprawą jest uścisk dłoni, nie wyjście.

Opcje podszywania się, które faktycznie przechodzą

Nie możesz dołączyć uścisku dłoni przeglądarki do standardowego klienta, manipulując ciągami szyfrów — pokrętła OpenSSL i urllib3 po prostu nie ujawniają każdego parametru, który odczytuje JA3. Co działa, to klient, który mówi dokładnym dialektem TLS przeglądarki:

# curl_cffi: a browser-shaped handshake in two lines
from curl_cffi import requests

session = requests.Session(impersonate="chrome120")
r = session.get(
    "https://example.com",
    proxies={"https": "http://USER:PASS@gate.quantumproxies.io:8000"},
    timeout=20,
)
print(r.status_code)  # matched JA3 + a clean residential exit

Zauważ proxy w tym fragmencie. Podszywanie się i czyste wyjście są komplementarne, a nie alternatywne: uścisk dłoni w kształcie przeglądarki przechodzi przez kontrolę TLS, a czyste IP rezydencjalne utrzymuje żądanie poza listami blokad reputacji. Połącz je, a naprawisz obie osie naraz.

Pomiń wyścig zbrojeń TLS z Scraper API

Kiedy przekazać cały problem

Impersonacja DIY działa, dopóki cel nie zmieni swojej detekcji, nie doda odcisku HTTP/2 lub nie wymaga wykonania JavaScript — wtedy utrzymujesz bibliotekę emulacji przeglądarki jako drugą pracę. Scraper API posiada prawdziwy, rotujący odcisk przeglądarki, dopasowuje warstwę HTTP/2, uruchamia JS na żądanie i zwraca czysty HTML, markdown lub JSON z jednego wywołania. Zamienia wyścig zbrojeń TLS w problem kogoś innego, podczas gdy ty zajmujesz się danymi. Dla szerszego obrazu, jak strony flagują automatyzację, zobacz nasz przewodnik po każdym sygnale wykrywania proxy.

Najczęściej zadawane pytania

Co to jest odcisk JA3?

Odcisk JA3 to hash MD5 pięciu pól pobranych z TLS ClientHello — wersji TLS, zestawów szyfrów, rozszerzeń, krzywych eliptycznych i formatów punktów. Ponieważ każdy stos oprogramowania porządkuje te pola inaczej, hash identyfikuje klienta (Chrome, Firefox, curl, Python) zanim zostaną wymienione jakiekolwiek dane HTTP.

Jaka jest różnica między JA3 a JA4?

JA3 haszuje pięć pól ClientHello za pomocą MD5 i łamie się, gdy przeglądarki losowo zmieniają kolejność rozszerzeń. JA4, od FoxIO, sortuje pola przed haszowaniem, aby przetrwać tę losowość, dodaje czytelny dla człowieka prefiks metadanych i obejmuje QUIC/HTTP/3, ALPN i algorytmy podpisu. JA4 to bardziej niezawodny nowoczesny sygnał; JA3N to znormalizowany środek tymczasowy dla JA3.

Czy mogę obejść odcisk TLS tylko za pomocą proxy?

Nie. Proxy zmieniają IP, nie uścisk dłoni. Jeśli twój odcisk TLS pasuje do znanej biblioteki scrapingu, rotacja wyjść nie pomoże — każde żądanie nadal niesie sygnaturę bota. Potrzebujesz klienta, który odtwarza stos TLS przeglądarki, a następnie czystego proxy na górze dla reputacji IP.

Czy Python requests ma wykrywalny odcisk TLS?

Tak. requests używa urllib3 z charakterystycznym porządkiem szyfrów i rozszerzeń, który dostawcy antybotowi skatalogowali, więc jego JA3 to znana sygnatura bota. Przełącz się na curl_cffi z profilem impersonate, aby wysłać uścisk dłoni dopasowany do przeglądarki.

Odcisk TLS przeniósł walkę poniżej HTTP, co jest powodem, dla którego sztuczki z nagłówkami i rotacja IP przestały wystarczać same w sobie. Dopasuj uścisk dłoni, utrzymaj czyste wyjście, a problem 403-przy-pierwszym-żądaniu zniknie. To jest techniczne doradztwo, a nie licencja na ignorowanie warunków strony — zawsze scrapuj zgodnie z prawem i zasadami celu.

Pozwól Scraper API obsłużyć JA3, JA4 i HTTP/2