Co to jest TLS Fingerprinting?
Pobieranie odcisków palców TLS jest techniką wykrywania biernego, która identyfikuje klientów w oparciu o sposób inicjowania zaszyfrowanych połączeń. Za każdym razem, gdy Twój scraper, przeglądarka lub biblioteka HTTP łączy się ze stroną internetową przez HTTPS, wysyła wiadomość TLS ClientHello zawierającą zestawy szyfrowe, rozszerzenia, krzywe eliptyczne i inne parametry w określonej kolejności. Systemy anty-bot analizują ten uścisk dłoni, aby ustalić, czy łączący się klient odpowiada temu, co jego agent użytkownik twierdzi, że jest.
W przeciwieństwie do pobieranie odcisków palców przez przeglądarkę, co wymaga wykonania JavaScript, drukarnie odcisków palców TLS na warstwie sieciowej - zanim zostanie dostarczona jakakolwiek zawartość strony. To sprawia, że jest to jeden z najwcześniejszych i najtrudniejszych sygnałów do wykrycia uniknąć, jak pokryte w naszym kompleksowy przewodnik jak systemy antybotowe wykrywają proxy.
Jak działa TLS uściski dłoni
Przed wymianą danych HTTP przez HTTPS klient i serwer wykonują uścisk dłoni TLS. Pierwsza krytyczna wiadomość - ClientHello - zawiera wszystko, czego systemy antybotowe potrzebują do pobierania odcisków palców:
- Wersja TLS: Maksymalna wersja TLS obsługiwana przez klienta (np. TLS 1.2, TLS 1.3).
- Apartamenty Cipher: Zamówiona lista algorytmów szyfrujących, których klient jest gotów użyć.
- Rozszerzenia: Dodatkowe możliwości, takie jak oznaczenie nazwy serwera (SNI), ALPN, algorytmy podpisu i kluczowe grupy akcji.
- Krzywe elliptyczne: Obsługiwane typy krzywych dla wymiany kluczy (np. x25519, secp256r1).
- Metody kompresji: Zazwyczaj nieaktualne w nowoczesnych implementacjach, ale ich obecność lub nieobecność nadal jest sygnałem.
Każda biblioteka HTTP, przeglądarka i język programowania runtime tworzy odrębny wzór KlientHello. Chrome, Firefox, Safari, Python requests, Go 's net/httpi Node.js każdy ma rozpoznawalne podpisy.
JA3 Drukowanie odcisków palców
JA3 jest najczęściej stosowaną metodą pobierania odcisków palców TLS. Opracowany przez inżynierów Salesforce, tworzy hasz MD5 z pięciu pól w wiadomości ClientHello:
| Pole | Opis | Przykład Wartości |
|---|---|---|
| Wersja TLS | Proponowana wersja protokołu | 771 (TLS 1.2), 772 (TLS 1.3) |
| Suites Cipher | Zamówiony wykaz kodów pakietu szyfrującego | 4865- 4866- 4867- 49195- 49199... |
| Rozszerzenia | Wykaz kodów typu rozszerzenia | 0- 23- 65281- 10- 11- 35- 16- 5... |
| Krzywe elliptyczne | Obsługiwane grupy | 29- 23- 24 |
| Formaty punktowe WE | Obsługiwane typy formatów punktów | 0 |
Te pięć wartości łączy się z przecinkami i hashed do produkcji 32- znaków JA3 odciski palców. Na przykład Pythona requests biblioteka produkuje inny hash JA3 niż Chrome, nawet jeśli oba ustawienia tego samego łańcucha agenta użytkownika.
JA3 Wykrywanie w praktyce
# Example JA3 hash computation (conceptual)
# ClientHello fields → concatenated string → MD5 hash
# Python requests (urllib3/OpenSSL) — distinct JA3
# ja3: 771,4866-4867-4865-49196-49200-159-52393-52392-52394...,0-23-65281-10-11...
# ja3_hash: "773906b0efdefa24a7f2b8eb6985bf37"
# Chrome 120+ — different cipher order, different extensions
# ja3: 771,4865-4866-4867-49195-49199-49196-49200-52393-52392...,0-23-65281-10-11...
# ja3_hash: "cd08e31494f9531f560d64c695473da9"
# The hash reveals the client library, regardless of User-Agent
JA4 - Następne pokolenie
JA4, także z Salesforce, poprawia się na JA3, wytwarzając bardziej czytelny i solidny odcisk palca. Zamiast nieprzezroczystego haszu MD5, JA4 tworzy ustrukturyzowany identyfikator z trzema składnikami:
- JA4 _ a: Typ protokołu + wersja TLS + obecność SNI + liczba szyfrów + liczba rozszerzeń + ALPN pierwsza wartość (np. "t13d1517h2 _ 8daaf6152771 _ b0da82dd1658").
- JA4 _ b: Ssortowane okrojone mieszanko apartamentów szyfrujących.
- JA4 _ c: Sortowane skrócone hash rozszerzeń (z SNI i ALPN usunięte w celu zmniejszenia zmienności).
JA4 jest trudniejszy do wyduszenia, ponieważ zawiera dodatkowe sygnały i używa formatu, który opiera się proste dopasowanie haszu.
Wspólne TLS Odciski palców przez Klienta
| Klient | Biblioteka TLS | Uznane kwalifikacje | Ryzyko wykrycia |
|---|---|---|---|
| Chrome (najnowszy) | BoringSSL | Konkretny porządek szyfrowania, wartości GREASE, wsparcie ECH | Niski (jeśli dopasowany prawidłowo) |
| Firefox | NSS | Różne preferencje szyfrowania, rozszerzenie uprawnień delegowanych | Niski (jeśli dopasowany prawidłowo) |
| Żądania Pythona | OpenSSL (poprzez urllib3) | Brak GREASE, mniej rozszerzeń, OpenSSL kolejności szyfrowania | Bardzo wysoki |
| Go net / http | Go crypto / tls | Unikalny porządek szyfrowania, brak wielu rozszerzeń | Bardzo wysoki |
| Node.js (axios / got) | OpenSSL (poprzez węzeł) | Polecenie rozszerzenia specyficzne dla węzła, brak GREASE | Wysoki |
| lokówka | Zmienne (OpenSSL / NSS / etc.) | Zależy od budowy, ale zazwyczaj nie-przeglądarki odciski palców | Wysoki |
Dlaczego TLS Fingerprinting jest trudne do uniknięcia
Pobieranie odcisków palców TLS stanowi wyjątkowe wyzwanie w porównaniu z innymi metodami wykrywania:
- Wykrywanie warstw sieciowych: Działa przed wymianą zawartości HTTP, więc nie można go pokonać przez wstrzyknięcie JavaScript lub manipulację nagłówkiem.
- Podpis poziomu biblioteki: Odcisk palca jest określony przez bibliotekę TLS skompilowaną do czasu uruchomienia, a nie przez kod aplikacji. Zmiana łańcucha agenta użytkownika nie ma żadnego wpływu na odcisk palca TLS.
- Przejrzystość proxy: Standardowe proxy HTTP / HTTPS (w tym proxy mieszkaniowe) przekierowanie uścisku dłoni TLS z klienta na serwer, tak aby pochodzenie zobaczyło prawdziwy odcisk palca TLS klienta.
- Urządzenie sprzęgające: Każda niewielka wersja biblioteki TLS może stworzyć nieco inny odcisk palca, czyniąc wersję niedopasowaną wykrywalną.
TLS Fingerprinting Strategie kontroli
1. Użyj biblioteki TLS klasy Browser-
Najskuteczniejszym podejściem jest korzystanie z bibliotek TLS, które produkują identyczne dla przeglądarki komunikaty ClientHello:
# Python: Use curl_cffi to mimic browser TLS fingerprints
# pip install curl_cffi
from curl_cffi import requests
# Impersonate Chrome's TLS fingerprint
response = requests.get(
"https://example.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
)
print(response.status_code)
2. Użyj utls w Go
// Go: Use uTLS to mimic browser TLS fingerprints
// go get github.com/refraction-networking/utls
package main
import (
"fmt"
"io"
"net/http"
"net/url"
"crypto/tls"
tls2 "github.com/refraction-networking/utls"
)
func main() {
proxyURL, _ := url.Parse("http://USERNAME:PASSWORD@gate.proxyhat.com:8080")
transport := &http.Transport{
Proxy: http.ProxyURL(proxyURL),
TLSClientConfig: &tls.Config{InsecureSkipVerify: false},
}
// uTLS allows you to specify a ClientHelloID that mimics
// specific browsers (Chrome, Firefox, Safari, etc.)
// This requires custom dial integration — see uTLS docs
_ = tls2.HelloChrome_Auto // Example: mimic Chrome
client := &http.Client{Transport: transport}
resp, err := client.Get("https://example.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body[:100]))
}
3. Użyj Node.js z Custom TLS
// Node.js: Use got-scraping for browser-like TLS
// npm install got-scraping
import { gotScraping } from 'got-scraping';
const response = await gotScraping({
url: 'https://example.com',
proxyUrl: 'http://USERNAME:PASSWORD@gate.proxyhat.com:8080',
headerGeneratorOptions: {
browsers: ['chrome'],
operatingSystems: ['windows'],
}
});
// got-scraping uses custom TLS settings to mimic browser fingerprints
console.log(response.statusCode);
4. Użyj przeglądarek bez głowy
Bezgłowe przeglądarki (Puppeteer, Playwright) produkują autentyczne odciski palców przeglądarki TLS, ponieważ używają prawdziwej przeglądarki TLS stosu. Jest to najbardziej niezawodne ograniczenie, ale również najbardziej zasobochłonne. Zobacz nasz przewodnik skrobanie bez blokowania dla szczegółów konfiguracji.
Testowanie odcisków palców TLS
Przed uruchomieniem swojego scrapera, zweryfikuj jego odcisk palca TLS przed usługami wykrywania:
# Check your JA3 fingerprint against a test service
# Using Python with curl_cffi
from curl_cffi import requests
response = requests.get(
"https://tls.peet.ws/api/all",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
)
data = response.json()
print(f"JA3 Hash: {data.get('tls', {}).get('ja3_hash', 'N/A')}")
print(f"JA4: {data.get('tls', {}).get('ja4', 'N/A')}")
print(f"HTTP Version: {data.get('http_version', 'N/A')}")
Odcisk palca TLS zależy od biblioteki klienta HTTP, a nie od proxy. Przełączanie się z datacenter na proxy mieszkaniowe zmienia reputację IP, ale nie zmienia podpisu TLS. Obie warstwy muszą być uwzględnione.
HTTP / 2 Drukowanie odcisków palców
Poza TLS protokół HTTP / 2 ujawnia tożsamość klienta poprzez ustawienia połączeń, kolejność ramki nagłówka i ramki priorytetowe. Systemy antybotowe łączą odciski palców TLS i HTTP / 2 dla większej dokładności:
| Sygnał HTTP / 2 | Co odkrywa |
|---|---|
| Wartości ramki SETTINGS | Początkowy rozmiar okna, max równoległe strumienie - różni się według klienta |
| Rozmiar okna _ update | Wartość przyrostu kontroli przepływu - unikalna dla każdej implementacji |
| Kolejność ramki nagłówka | Zamawianie nagłówka Pseudo- (: metoda,: władza,: schemat,: ścieżka) |
| Ramy PRIORYTETOWE | Uzależnienie od strumienia i waga - wzorce specyficzne dla przeglądarki |
Biblioteki takie jak curl_cffi oraz got-scraping adres pobierania odcisków palców HTTP / 2 oprócz pobierania odcisków palców TLS.
Połączenie ograniczenia TLS z rotacją proxy
Skuteczne warstwy strategii antydetekcji TLS pasujące do odcisków palców rotacja proxy wysokiej jakości:
- Dopasuj TLS do agenta użytkownika: Jeśli twój agent twierdzi, że Chrome, odcisk palca TLS musi pasować do Chrome.
- Użyj proxy mieszkalnych: ProxyHat 's residential proxy zapewnia czyste IP uzupełniające podpisy TLS klasy przeglądarkowej.
- Obracaj konsekwentnie: Każda sesja powinna korzystać z dopasowanego profilu IP + TLS + kombinacja agenta użytkownika.
- Unikać mieszania bibliotek: Nie należy używać tego samego IP z różnymi odciskami palców TLS - jest to silny sygnał bot.
- Badanie przed wdrożeniem: Sprawdzić odcisk palca pasuje do żądanej przeglądarki za pomocą punktów końcowych testu.
Integracja proxy specyficzna dla języka, zobacz nasze przewodniki dla Python, Node.jsoraz Idź..
Rozważania etyczne i prawne
Mimika odcisków palców TLS powinna być używana odpowiedzialnie. Legalne przypadki zastosowania obejmują:
- Dostęp do publicznie dostępnych danych poprzez standardowe połączenia HTTPS
- Badania bezpieczeństwa i badania penetracji własnej infrastruktury
- Zapewnianie zautomatyzowanych testów dokładnie symuluje prawdziwe zachowanie przeglądarki
- Badania dotyczące prywatności w jaki sposób pobieranie odcisków palców TLS wpływa na śledzenie użytkowników
Zawsze przestrzegaj warunków serwisowych, limitów stawek i obowiązujących przepisów. Zobacz Dokumentacja ProxyHat za odpowiedzialne wytyczne dotyczące stosowania.






