Glosario

¿Qué es una huella TLS (JA3 / JA4)?

Una huella TLS es un hash derivado de la estructura específica del handshake TLS de un cliente (lista de cifrados, extensiones, valores ALPN, bytes GREASE, etc.) que identifica el cliente HTTP, navegador o biblioteca subyacente antes de que se intercambie ningún dato de la capa de aplicación.

Descubre cómo funcionan JA3 y JA4, por qué revelan que estás usando Python requests o curl antes de que tu scraper envíe siquiera una solicitud HTTP, y cómo neutralizarlos.

Explicado

Cuando su cliente abre una conexión TLS, los primeros bytes son un paquete ClientHello que describe qué conjuntos de cifrado, versiones TLS, extensiones, curvas elípticas y valores ALPN admite su cliente. La lista exacta y el orden de estos atributos son específicos de la implementación: el ClientHello de Chrome tiene un aspecto diferente al de Firefox, que tiene un aspecto diferente al de curl, que tiene un aspecto diferente al de la biblioteca `requests` de Python, y así sucesivamente.

JA3 (y su sucesor JA4) es un formato de hash que convierte la estructura del ClientHello en un identificador corto. Los proveedores de soluciones anti-bot calculan este hash para cada conexión TLS entrante y lo comprueban con firmas conocidas. Si su scraper utiliza Python `requests`, su huella TLS coincide con el valor predeterminado de OpenSSL y es identificable al instante como 'no es un navegador real', incluso antes de enviar un solo byte HTTP.

Esta es la razón por la que tantos scrapers fallan en Cloudflare, Akamai y sistemas similares incluso cuando la IP y el User-Agent parecen correctos. La capa TLS revela que la solicitud no provino de Chrome. Las bibliotecas de sigilo modernas (como `curl_cffi`, `tls-client`, Playwright con los parámetros de lanzamiento correctos) imitan las huellas TLS de navegadores reales para evitar esto.

Cómo funciona

JA3 construye la huella a partir de cinco campos del ClientHello: versión TLS, conjuntos de cifrado admitidos, extensiones admitidas, curvas elípticas admitidas y formatos de punto de curva elíptica admitidos. Los une, aplica un hash MD5 al resultado y produce una firma de 32 caracteres.

JA4 (el reemplazo moderno) amplía esto con ALPN, versión, presencia de SNI, manejo de GREASE y ordena las extensiones de una manera estable que es resistente a la aleatorización. JA4 también tiene variantes para QUIC (JA4Q), HTTP (JA4H) y sesión SSL (JA4S). Los servidores calculan la huella y la consultan en listas de permitidos/denegados o la introducen en un modelo de puntuación de riesgo junto con otras señales.

Tipos

JA3

Huella TLS ClientHello original, MD5 de los campos ordenados de cifrado, extensión, curva y formato. Ampliamente desplegada pero vulnerable a la aleatorización del orden de extensiones en los navegadores modernos.

JA3S

Contraparte del lado del servidor de JA3, genera la huella del TLS ServerHello. Se utiliza para identificar la pila de software del servidor en lugar del cliente.

JA4

Sucesor moderno de JA3. Maneja GREASE, aleatorización y ordenación de extensiones de forma más robusta. Se divide en JA4 (TCP), JA4Q (QUIC), JA4H (HTTP), JA4L (latencia), JA4T (huella TCP), JA4X (certificado X.509).

Akamai BMP / Datadome / Cloudflare bot.management

Huellas antibot propietarias que se basan en JA3/JA4 con señales adicionales (peculiaridades de aleatorización del orden de extensiones TLS, inspección de bytes GREASE, temporización de paquetes). Prácticamente imposibles de falsificar sin usar un navegador real.

Casos de uso habituales

Identificación de clientes HTTP (curl, requests, Python http.client) antes de cualquier capa HTTP
Defensa antibot en la capa TLS
Análisis forense de red y reglas IDS
Limitación de velocidad por tipo de cliente
Detección de clientes de scraping personalizados o modificados
Preguntas frecuentes

Preguntas frecuentes

Preguntas frecuentes sobre huella digital tls.

El User-Agent es una cabecera HTTP que tu cliente envía en texto plano; puedes establecerlo con cualquier valor. JA3 se calcula a partir de la estructura del propio handshake TLS: no puedes cambiarlo simplemente estableciendo una cabecera. Para cambiar tu JA3 tienes que cambiar la biblioteca TLS subyacente del cliente o su configuración.

Probablemente por una discrepancia en la huella TLS. Python `requests` usa la pila TLS de urllib3, que produce un JA3/JA4 que no coincide con Chrome. Cloudflare lo detecta incluso cuando tu User-Agent indica Chrome. Usa `curl_cffi` (que imita el TLS de Chrome) o ejecuta un navegador real mediante Playwright/Puppeteer para solucionarlo.

Chrome, Edge, Firefox y Safari reales tienen cada uno su propio JA3 (y lo aleatorizan ligeramente para evitar listas de bloqueo simples). curl, wget, Python requests, net/http de Go, https de Node, OkHttp, Java HttpClient y docenas de otros tienen JA3 distintos e identificables. Existen bases de datos públicas (ja3er.com, abuse.ch) que los catalogan.

Usa un cliente HTTP que imite TLS como `curl_cffi` (Python), `cycletls` (Go), `tls-client` (Go/Python), o ejecuta un navegador Chromium real mediante Playwright/Puppeteer. Estas bibliotecas reproducen la estructura exacta de ClientHello de Chrome para que el JA3/JA4 coincida con Chrome en lugar de delatarte como un script.

El Chrome moderno ya aleatoriza su ClientHello (mediante la extensión GREASE) para dificultar el almacenamiento en caché y la toma de huellas digitales. JA4 fue diseñado para gestionar esto. La aleatorización ingenua en el lado del cliente a menudo te hace más identificable, no menos, porque el resultado no se parece al de ningún navegador real. En su lugar, imita el JA3 de un navegador real.

De forma indirecta. Los proxies no cambian tu huella digital TLS: tu cliente sigue realizando el handshake TLS de extremo a extremo con el destino. Sin embargo, las IPs residenciales reducen la sospecha de base, por lo que un JA3 que no sea de Chrome desde una IP residencial a veces es aceptable para los sistemas antibot, mientras que el mismo JA3 desde una IP de datacenter se bloquea de inmediato. Aun así, la respuesta correcta es corregir ambas capas.