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.