Glossar

Was ist ein TLS-Fingerabdruck (JA3 / JA4)?

Ein TLS-Fingerabdruck ist ein Hash, der aus der spezifischen Struktur des TLS-Handshakes eines Clients abgeleitet wird (Cipher-Liste, Erweiterungen, ALPN-Werte, GREASE-Bytes usw.) und den zugrunde liegenden HTTP-Client, Browser oder die Bibliothek identifiziert, bevor Daten auf Anwendungsebene ausgetauscht werden.

Verstehen Sie, wie JA3 und JA4 funktionieren, warum sie verraten, dass Sie Python requests oder curl verwenden, bevor Ihr Scraper überhaupt eine HTTP-Anfrage sendet, und wie Sie sie neutralisieren können.

Erklärt

Wenn Ihr Client eine TLS-Verbindung öffnet, sind die allerersten Bytes ein ClientHello-Paket, das beschreibt, welche Cipher Suites, TLS-Versionen, Erweiterungen, elliptischen Kurven und ALPN-Werte Ihr Client unterstützt. Die genaue Liste und Reihenfolge dieser Attribute ist implementierungsspezifisch - Chromes ClientHello sieht anders aus als das von Firefox, das sich von curl unterscheidet, das sich von Pythons `requests`-Bibliothek unterscheidet, und so weiter.

JA3 (und sein Nachfolger JA4) ist ein Hash-Format, das die Struktur des ClientHello in einen kurzen Bezeichner umwandelt. Anti-Bot-Anbieter berechnen diesen Hash für jede eingehende TLS-Verbindung und gleichen ihn mit bekannten Signaturen ab. Wenn Ihr Scraper Python `requests` verwendet, stimmt Ihr TLS-Fingerprint mit dem OpenSSL-Standard überein und ist sofort als 'kein echter Browser' identifizierbar - noch bevor Sie ein einziges HTTP-Byte senden.

Das ist der Grund, warum so viele Scraper bei Cloudflare, Akamai und ähnlichen Systemen scheitern, selbst wenn IP und User-Agent korrekt aussehen. Die TLS-Schicht verrät, dass die Anfrage nicht von Chrome kam. Moderne Stealth-Bibliotheken (wie `curl_cffi`, `tls-client`, Playwright mit den richtigen Launch-Flags) imitieren echte Browser-TLS-Fingerprints, um dies zu vermeiden.

So funktioniert es

JA3 erstellt den Fingerprint aus fünf Feldern des ClientHello: TLS-Version, unterstützte Cipher Suites, unterstützte Erweiterungen, unterstützte elliptische Kurven und unterstützte Punktformate elliptischer Kurven. Diese werden zusammengefügt, das Ergebnis wird MD5-gehasht und ergibt eine 32-Zeichen-Signatur.

JA4 (der moderne Nachfolger) erweitert dies um ALPN, Version, SNI-Präsenz, GREASE-Behandlung und ordnet Erweiterungen auf eine stabile Weise, die gegenüber Randomisierung robust ist. JA4 hat auch Varianten für QUIC (JA4Q), HTTP (JA4H) und SSL-Session (JA4S). Server berechnen den Fingerprint und gleichen ihn entweder mit Zulassungs-/Sperrlisten ab oder speisen ihn zusammen mit anderen Signalen in ein Risikobewertungsmodell ein.

Typen

JA3

Originaler TLS-ClientHello-Fingerabdruck, MD5 aus geordneten Cipher-/Erweiterungs-/Kurven-/Formatfeldern. Weit verbreitet, aber anfällig für die Randomisierung der Erweiterungsreihenfolge in modernen Browsern.

JA3S

Serverseitiges Gegenstück zu JA3, erstellt Fingerabdrücke des TLS-ServerHello. Wird verwendet, um den Server-Software-Stack statt des Clients zu identifizieren.

JA4

Moderner Nachfolger von JA3. Behandelt GREASE, Randomisierung und Erweiterungsreihenfolge robuster. Unterteilt in JA4 (TCP), JA4Q (QUIC), JA4H (HTTP), JA4L (Latenz), JA4T (TCP-Fingerabdruck), JA4X (X.509-Zertifikat).

Akamai BMP / Datadome / Cloudflare bot.management

Proprietäre Anti-Bot-Fingerabdrücke, die auf JA3/JA4 mit zusätzlichen Signalen aufbauen (Besonderheiten bei der Randomisierung der TLS-Erweiterungsreihenfolge, GREASE-Byte-Inspektion, Paket-Timing). Praktisch unmöglich zu fälschen, ohne einen echten Browser zu verwenden.

Häufige Anwendungsfälle

Identifizierung von HTTP-Clients (curl, requests, Python http.client) vor jeder HTTP-Schicht
Bot-Abwehr auf der TLS-Schicht
Netzwerk-Forensik und IDS-Regeln
Rate-Limiting nach Client-Typ
Erkennung benutzerdefinierter oder modifizierter Scraping-Clients
FAQ

Häufig gestellte Fragen

Häufige Fragen zu tls fingerprint.

User-Agent ist ein HTTP-Header, den Ihr Client im Klartext sendet; Sie können ihn auf beliebige Werte setzen. JA3 wird aus der Struktur des TLS-Handshakes selbst berechnet - Sie können ihn nicht einfach durch das Setzen eines Headers ändern. Um Ihren JA3 zu ändern, müssen Sie die zugrunde liegende TLS-Client-Bibliothek oder deren Konfiguration ändern.

Wahrscheinlich ein TLS-Fingerabdruck-Konflikt. Python `requests` verwendet den TLS-Stack von urllib3, der einen JA3/JA4 erzeugt, der nicht mit Chrome übereinstimmt. Cloudflare erkennt dies, selbst wenn Ihr User-Agent Chrome angibt. Verwenden Sie `curl_cffi` (das den TLS von Chrome imitiert) oder führen Sie einen echten Browser über Playwright/Puppeteer aus, um das Problem zu beheben.

Echtes Chrome / Edge / Firefox / Safari haben jeweils ihren eigenen JA3 (und randomisieren ihn leicht, um naive Sperrlisten zu umgehen). curl, wget, Python requests, Gos net/http, Nodes https, OkHttp, Java HttpClient und Dutzende andere haben jeweils eindeutig identifizierbare JA3s. Es gibt öffentliche Datenbanken (ja3er.com, abuse.ch), die diese katalogisieren.

Verwenden Sie einen TLS-imitierenden HTTP-Client wie `curl_cffi` (Python), `cycletls` (Go), `tls-client` (Go/Python), oder führen Sie einen echten Chromium-Browser über Playwright/Puppeteer aus. Diese Bibliotheken reproduzieren die exakte ClientHello-Struktur von Chrome, sodass der JA3/JA4 mit Chrome übereinstimmt, anstatt Sie als Skript zu verraten.

Modernes Chrome randomisiert sein ClientHello bereits (über die GREASE-Erweiterung), um Caching und Fingerprinting zu erschweren. JA4 wurde entwickelt, um damit umzugehen. Naive Randomisierung auf der Client-Seite macht Sie oft identifizierbarer, nicht weniger, da das Ergebnis keinem echten Browser ähnelt. Passen Sie stattdessen den JA3 eines echten Browsers an.

Indirekt. Proxies ändern Ihren TLS-Fingerprint nicht -- Ihr Client führt den TLS-Handshake weiterhin vollständig mit dem Ziel durch. Aber Residential-IPs reduzieren den grundlegenden Verdacht, sodass ein Nicht-Chrome-JA3 von einer Residential-IP manchmal für Anti-Bot-Systeme akzeptabel ist, während derselbe JA3 von einer Datacenter-IP sofort blockiert wird. Dennoch ist die Behebung beider Ebenen die richtige Antwort.