Glossário

O Que É uma Impressão Digital TLS (JA3 / JA4)?

Uma impressão digital TLS (TLS fingerprint) é um hash derivado da estrutura específica do handshake TLS de um cliente (lista de cifras, extensões, valores ALPN, bytes GREASE etc.) que identifica o cliente HTTP, navegador ou biblioteca subjacente antes de qualquer troca de dados na camada de aplicação.

Entenda como o JA3 e o JA4 funcionam, por que eles revelam que você está usando Python requests ou curl antes mesmo de o seu scraper enviar uma requisição HTTP, e como neutralizá-los.

Explicado

Quando seu cliente abre uma conexão TLS, os primeiros bytes são um pacote ClientHello que descreve quais conjuntos de cifras, versões do TLS, extensões, curvas elípticas e valores ALPN o seu cliente suporta. A lista exata e a ordem desses atributos são específicas da implementação — o ClientHello do Chrome é diferente do Firefox, que é diferente do curl, que é diferente da biblioteca `requests` do Python, e assim por diante.

O JA3 (e seu sucessor JA4) é um formato de hash que transforma a estrutura do ClientHello em um identificador curto. Fornecedores de anti-bot calculam esse hash para cada conexão TLS recebida e o comparam com assinaturas conhecidas. Se o seu scraper usa `requests` do Python, sua fingerprint TLS corresponde ao padrão do OpenSSL e é instantaneamente identificada como 'não é um navegador real' — mesmo antes de você enviar um único byte HTTP.

É por isso que tantos scrapers falham no Cloudflare, Akamai e stacks semelhantes mesmo quando o IP e o User-Agent parecem corretos. A camada TLS denuncia que a requisição não veio do Chrome. Bibliotecas modernas de stealth (como `curl_cffi`, `tls-client`, Playwright com as flags de inicialização certas) imitam fingerprints TLS de navegadores reais para evitar isso.

Como Funciona

O JA3 constrói a fingerprint a partir de cinco campos do ClientHello: versão do TLS, cipher suites suportadas, extensões suportadas, curvas elípticas suportadas e formatos de ponto de curva elíptica suportados. Ele os junta, aplica hash MD5 ao resultado e produz uma assinatura de 32 caracteres.

O JA4 (o substituto moderno) estende isso com ALPN, versão, presença de SNI, tratamento de GREASE, e ordena as extensões de forma estável e resistente à randomização. O JA4 também tem variantes para QUIC (JA4Q), HTTP (JA4H) e sessão SSL (JA4S). Os servidores calculam a fingerprint e ou a verificam em listas de permissão/bloqueio ou a alimentam em um modelo de pontuação de risco junto com outros sinais.

Tipos

JA3

Fingerprint original do TLS ClientHello, MD5 dos campos ordenados de cifra / extensão / curva / formato. Amplamente utilizado, mas vulnerável à randomização da ordem de extensões em navegadores modernos.

JA3S

Equivalente do lado do servidor do JA3, identifica a impressão digital do ServerHello do TLS. Usado para identificar a pilha de software do servidor em vez do cliente.

JA4

Sucessor moderno do JA3. Lida com GREASE, randomização e ordenação de extensões de forma mais robusta. Divide-se em JA4 (TCP), JA4Q (QUIC), JA4H (HTTP), JA4L (latência), JA4T (fingerprint de TCP), JA4X (certificado X.509).

Akamai BMP / Datadome / Cloudflare bot.management

Fingerprints antibot proprietários que se baseiam em JA3/JA4 com sinais adicionais (peculiaridades de randomização da ordem das extensões TLS, inspeção de bytes GREASE, tempo de pacotes). Praticamente impossível de falsificar sem usar um navegador real.

Casos de Uso Comuns

Identificação de clientes HTTP (curl, requests, Python http.client) antes de qualquer camada HTTP
Defesa contra bots na camada TLS
Forense de rede e regras de IDS
Rate limiting por tipo de cliente
Detecção de clientes de scraping personalizados ou modificados
Perguntas Frequentes

Perguntas frequentes

Perguntas comuns sobre impressão digital de tls.

O User-Agent é um cabeçalho HTTP que seu cliente envia em texto simples; você pode defini-lo como quiser. O JA3 é calculado a partir da própria estrutura do handshake TLS - você não pode alterá-lo apenas definindo um cabeçalho. Para alterar seu JA3, é preciso mudar a biblioteca cliente TLS subjacente ou sua configuração.

Provável incompatibilidade de fingerprint TLS. O `requests` do Python usa a stack TLS do urllib3, que gera um JA3/JA4 que não corresponde ao Chrome. O Cloudflare detecta isso mesmo quando seu User-Agent diz Chrome. Use o `curl_cffi` (que imita o TLS do Chrome) ou execute um navegador real via Playwright/Puppeteer para corrigir isso.

Chrome / Edge / Firefox / Safari reais têm cada um seu próprio JA3 (e o randomizam ligeiramente para driblar listas de bloqueio ingênuas). curl, wget, Python requests, net/http do Go, https do Node, OkHttp, Java HttpClient e dezenas de outros têm cada um JA3s identificáveis distintos. Existem bancos de dados públicos (ja3er.com, abuse.ch) que os catalogam.

Use um cliente HTTP com falsificação de TLS como `curl_cffi` (Python), `cycletls` (Go), `tls-client` (Go/Python), ou execute um navegador Chromium real via Playwright/Puppeteer. Essas bibliotecas reproduzem a estrutura exata do ClientHello do Chrome, de modo que o JA3/JA4 corresponda ao Chrome em vez de revelar que você é um script.

O Chrome moderno já randomiza seu ClientHello (via a extensão GREASE) para dificultar o caching e o fingerprinting. O JA4 foi projetado para lidar com isso. A randomização ingênua no lado do cliente geralmente torna você mais identificável, não menos, porque o resultado não se parece com nenhum navegador real. Em vez disso, corresponda ao JA3 de um navegador real.

Indiretamente. Proxies não mudam sua impressão digital TLS, seu cliente ainda faz o handshake TLS de ponta a ponta com o destino. Mas IPs residenciais reduzem a suspeita básica, então um JA3 não-Chrome vindo de um IP residencial às vezes é aceitável para sistemas antibot, enquanto o mesmo JA3 vindo de um IP de datacenter é bloqueado instantaneamente. Ainda assim, corrigir as duas camadas é a resposta certa.