Glossaire

Qu'est-ce qu'une empreinte TLS (JA3 / JA4) ?

Une empreinte TLS est un hachage dérivé de la structure spécifique du handshake TLS d'un client (liste de chiffrements, extensions, valeurs ALPN, octets GREASE, etc.) qui identifie le client HTTP, le navigateur ou la bibliothèque sous-jacents avant même qu'aucune donnée de la couche applicative ne soit échangée.

Comprenez le fonctionnement de JA3 et JA4, pourquoi ils révèlent que vous utilisez Python requests ou curl avant même que votre scraper n'envoie une requête HTTP, et comment les neutraliser.

Expliqué

Lorsque votre client ouvre une connexion TLS, les tout premiers octets constituent un paquet ClientHello décrivant les suites de chiffrement, les versions TLS, les extensions, les courbes elliptiques et les valeurs ALPN que votre client prend en charge. La liste exacte et l'ordre de ces attributs sont spécifiques à l'implémentation — le ClientHello de Chrome est différent de celui de Firefox, qui est différent de celui de curl, qui est différent de celui de la bibliothèque `requests` de Python, etc.

JA3 (et son successeur JA4) est un format de hachage qui transforme la structure du ClientHello en un identifiant court. Les fournisseurs anti-bot calculent ce hachage pour chaque connexion TLS entrante et le comparent aux signatures connues. Si votre scraper utilise `requests` Python, votre empreinte TLS correspond à la valeur par défaut d'OpenSSL et est instantanément identifiable comme 'pas un vrai navigateur' — même avant l'envoi d'un seul octet HTTP.

C'est pourquoi tant de scrapers échouent sur Cloudflare, Akamai et des infrastructures similaires même lorsque l'IP et le User-Agent semblent corrects. La couche TLS révèle que la requête ne provient pas de Chrome. Les bibliothèques furtives modernes (comme `curl_cffi`, `tls-client`, Playwright avec les bons paramètres de lancement) imitent les empreintes TLS de vrais navigateurs pour éviter cela.

Comment ça fonctionne

JA3 construit l'empreinte à partir de cinq champs du ClientHello : la version TLS, les suites de chiffrement prises en charge, les extensions prises en charge, les courbes elliptiques prises en charge et les formats de points de courbe elliptique pris en charge. Il les assemble, hache le résultat en MD5 et produit une signature de 32 caractères.

JA4 (le remplacement moderne) étend cela avec ALPN, la version, la présence de SNI, la gestion de GREASE, et ordonne les extensions de manière stable et résistante à la randomisation. JA4 dispose également de variantes pour QUIC (JA4Q), HTTP (JA4H) et la session SSL (JA4S). Les serveurs calculent l'empreinte et la comparent à des listes d'autorisation/refus ou l'intègrent dans un modèle de notation du risque avec d'autres signaux.

Types

JA3

Empreinte TLS ClientHello originale, MD5 des champs ordonnés de chiffrement / extension / courbe / format. Largement déployée, mais vulnérable à la randomisation de l'ordre des extensions dans les navigateurs modernes.

JA3S

Équivalent côté serveur de JA3, prend l'empreinte du TLS ServerHello. Utilisé pour identifier la pile logicielle du serveur plutôt que le client.

JA4

Successeur moderne de JA3. Gère GREASE, la randomisation et l'ordre des extensions de manière plus robuste. Se décline en JA4 (TCP), JA4Q (QUIC), JA4H (HTTP), JA4L (latence), JA4T (empreinte TCP), JA4X (certificat X.509).

Akamai BMP / Datadome / Cloudflare bot.management

Empreintes anti-bot propriétaires qui s'appuient sur JA3/JA4 avec des signaux supplémentaires (particularités de la randomisation de l'ordre des extensions TLS, inspection des octets GREASE, timing des paquets). Pratiquement impossibles à falsifier sans utiliser un vrai navigateur.

Cas d'utilisation courants

Identification des clients HTTP (curl, requests, Python http.client) avant toute couche HTTP
Défense anti-bot au niveau de la couche TLS
Forensique réseau et règles IDS
Limitation du débit par type de client
Détection de clients de scraping personnalisés ou modifiés
FAQ

Questions fréquentes Questions FAQ

Questions fréquentes sur empreinte tls.

Le User-Agent est un en-tête HTTP que votre client envoie en clair ; vous pouvez lui attribuer n'importe quelle valeur. JA3 est calculé à partir de la structure du handshake TLS lui-même : vous ne pouvez pas le modifier en changeant simplement un en-tête. Pour modifier votre JA3, vous devez changer la bibliothèque TLS sous-jacente ou sa configuration.