Fingerprinting TLS explicado: JA3, JA4 y cómo evitar la detección

Aprenda cómo la huella dactilar TLS revela su identidad de raspador a través de los hashes JA3/JA4, el análisis de la suite de cifrado y las señales HTTP/2, además de estrategias de mitigación usando bibliotecas TLS de grado navegador.

Fingerprinting TLS explicado: JA3, JA4 y cómo evitar la detección

¿Qué es la huella digital TLS?

La huella dactilar TLS es una técnica de detección pasiva que identifica a los clientes sobre la base de cómo inician conexiones cifradas. Cada vez que su raspador, navegador o biblioteca HTTP se conecta a un sitio web sobre HTTPS, envía un mensaje TLS ClientHello que contiene suites de cifrado, extensiones, curvas elípticas y otros parámetros en un orden específico. Los sistemas antibot analizan este apretón de manos para determinar si el cliente de conexión coincide con lo que su agente de usuario afirma ser.

Diferente huella dactilar del navegador, que requiere la ejecución de JavaScript, la huella TLS funciona en la capa de red, antes de que se envíe cualquier contenido de página. Esto hace que sea una de las señales de detección más tempranas y difíciles de evadir, tal como está cubierto en nuestro guía integral de cómo los sistemas antibot detectan proxies.

Cómo funciona TLS Handshakes

Antes de que se intercambian datos HTTP sobre HTTPS, el cliente y el servidor realizan un apretón de manos TLS. El primer mensaje crítico —el ClienteHello— contiene todo lo que los sistemas anti-bot necesitan para realizar huellas dactilares:

  1. Versión TLS: La versión TLS máxima soporta (por ejemplo, TLS 1.2, TLS 1.3).
  2. Cipher suites: Una lista ordenada de algoritmos de cifrado que el cliente está dispuesto a utilizar.
  3. Extensiones: Capacidades adicionales como Indicación de Nombre del Servidor (SNI), ALPN, algoritmos de firma y grupos de acciones clave.
  4. Curvas elípticas: Tipos de curvas compatibles para el intercambio clave (por ejemplo, x25519, secp256r1).
  5. Métodos de compresión: Típicamente nulas en implementaciones modernas, pero su presencia o ausencia sigue siendo una señal.

Cada biblioteca HTTP, el navegador y la programación del lenguaje runtime produce un patrón de ClientHello distinto. Chrome, Firefox, Safari, Python requestsVamos net/http, y Node.js cada uno tiene firmas reconocibles.

JA3 Fingerprinting

JA3 es el método de identificación TLS más implementado. Desarrollado por ingenieros de Salesforce, crea un hash MD5 de cinco campos en el mensaje de ClientHello:

JA3 Fingerprinting
CampoDescripciónValores de ejemplo
Versión TLSLa versión de protocolo ofrecida771 (TLS 1.2), 772 (TLS 1.3)
Cipher SuitesLista ordenada de códigos de suite de cifrado4865-4866-4867-49195-49199...
ExtensionesLista de códigos de tipo de extensión0-23-65281-10-11-35-16-5...
Curvas elípticasGrupos de apoyo nombrados29-23-24
EC Point FormatsTipos de formato de punto compatibles0

Estos cinco valores están concatenados con comas y hashed para producir una huella JA3 de 32 caracteres. Por ejemplo, Python's requests biblioteca produce una diferente JA3 hash que Chrome, incluso cuando ambos establecen la misma cadena de usuario-agente.

JA3 Detection in Practice

# 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 — La próxima generación

JA4, también de Salesforce, mejora en JA3 produciendo una huella más legible y robusta. En lugar de un hash MD5 opaco, JA4 crea un identificador estructurado con tres componentes:

  • JA4 a: Tipo de protocolo + TLS versión + presencia SNI + recuento de cifrado + recuento de extensión + ALPN primer valor (por ejemplo, "t13d1517h2 8daaf6152771 b0da82dd1658").
  • JA4 b: Hachís truncados clasificados de suites de cifer.
  • JA4 c: Hacha truncada clasificada de extensiones (con SNI y ALPN eliminado para reducir la variabilidad).

JA4 es más difícil de aprovechar porque incorpora señales adicionales y utiliza un formato que resiste la combinación simple de hash.

Marcas TLS comunes por cliente

Marcas TLS comunes por cliente
ClienteTLS LibraryTraits reconociblesRiesgo de detección
Chrome (último)BoringSSLOrden de cifrado específico, valores de crecimiento, soporte ECHBajo (si coincide correctamente)
FirefoxNSSDiferente preferencia de cifrado, extensión de credenciales delegadasBajo (si coincide correctamente)
Python requestsOpenSSL (via urllib3)Desaparecido GREASE, menos extensiones, orden de cifrado OpenSSLMuy alta
Go net/httpGo crypto/tlsOrden único de cifrado, faltando muchas extensionesMuy alta
Node.js (axios/got)OpenSSL (via Nodo)Orden de extensión de nodo específico, GREASE desaparecidoAlto
CurlVaries (OpenSSL/NSS/etc.)Depende de la construcción, pero típicamente no-browser huellaAlto

Por qué la huella de TLS es difícil de evadir

La huella dactilar TLS presenta desafíos únicos en comparación con otros métodos de detección:

  • Detección de capas de red: Funciona antes de que se intercambie cualquier contenido de HTTP, por lo que no puede ser derrotado por inyección de JavaScript o manipulación de encabezados.
  • Firma a nivel de biblioteca: La huella está determinada por la biblioteca TLS compilada en su tiempo de ejecución, no por su código de aplicación. Cambiar la cadena del usuario-agente tiene cero efecto en la huella TLS.
  • Transparencia indirecta: Proxies estándar HTTP/HTTPS (incluyendo proxies residenciales) adelante el apretón de manos TLS del cliente al servidor, por lo que el origen ve la huella TLS real de su cliente.
  • Acoplamiento de la versión: Cada versión menor de una biblioteca TLS puede producir una huella dactilar ligeramente diferente, lo que hace que la versión sea detectable.

TLS Fingerprinting Mitigation Strategies

1. Usar bibliotecas TLS de grado navegador

El enfoque más eficaz es utilizar las bibliotecas TLS que producen mensajes de ClientHello de navegador:

# 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. Uso de utls en 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. Use Node.js con TLS personalizado

// 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. Use Navegadores sin cabeza

Los navegadores sin cabeza (Puppeteer, Playwright) producen auténticas huellas TLS del navegador porque usan la pila TLS del navegador real. Esta es la mitigación más fiable, pero también la más intensa. Vea nuestra guía raspando sin ser bloqueado para detalles de configuración.

Probando su huella digital TLS

Antes de desplegar su rascador, verifique su huella TLS contra los servicios de detección:

# 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')}")
Su huella TLS está determinada por su biblioteca de clientes HTTP, no por su proxy. Cambiar de centro de datos a proxies residenciales cambia su reputación IP pero no cambia su firma TLS. Ambas capas deben ser abordadas.

HTTP/2 Fingerprinting

Más allá de TLS, el protocolo HTTP/2 revela la identidad del cliente a través de configuraciones de conexión, orden de marco y marcos prioritarios. Los sistemas antibot combinan las huellas TLS y HTTP/2 para mayor precisión:

HTTP/2 Fingerprinting
HTTP/2 SignalLo que revela
SETTINGS frame valuesTamaño inicial de la ventana, máximo flujos concurrentes - difiere por cliente
WINDOW UPDATE sizeValor de incremento de control de flujo - único en cada aplicación
Header frame orderPseudo-header ordering (:method, :authority, :scheme, :path)
Marcos de PRIORIDADAumentar la dependencia y el peso — patrones específicos del navegador

Bibliotecas como curl_cffi y got-scraping dirección HTTP/2 huella dactilar además de la huella TLS.

Combinando la Mitigación TLS con Rotación Proxy

Una estrategia eficaz contra la detección capas TLS huella dactilar coincidente con rotación proxy de alta calidad:

  1. Match TLS to user-agent: Si su usuario-agente afirma Chrome, su huella TLS debe coincidir con Chrome.
  2. Use proxies residenciales: Los proxies residenciales de ProxyHat proporcionar IPs limpias que complementan firmas TLS de grado navegador.
  3. Girar consistentemente: Cada sesión debe utilizar un perfil IP + TLS + combinación de usuario-agente.
  4. Evite mezclar bibliotecas: No reutilizar la misma IP con diferentes huellas TLS — esta es una señal de bot fuerte.
  5. Prueba antes del despliegue: Verificar su huella dactilar coincide con su navegador reclamado usando puntos finales de prueba.

Para la integración proxy específica del lenguaje, vea nuestras guías para Python, Node.js, y Vamos..

Consideraciones éticas y jurídicas

La imitación de huellas dactilares TLS debe ser utilizada responsablemente. Los casos de uso legítimo incluyen:

  • Acceso a los datos disponibles públicamente mediante conexiones estándar HTTPS
  • Investigación de seguridad y pruebas de penetración de su propia infraestructura
  • Asegurar sus pruebas automatizadas simular con precisión el comportamiento real del navegador
  • Investigación de privacidad estudiando cómo la huella dactilar TLS afecta el seguimiento del usuario

Siempre respeta los términos del servicio, los límites de tarifas y los reglamentos aplicables. Véase Documentación de ProxyHat para las directrices de uso responsables.

Preguntas frecuentes

¿Listo para empezar?

Accede a más de 50M de IPs residenciales en más de 148 países con filtrado impulsado por IA.

Ver preciosProxies residenciales
← Volver al Blog