
TLS Fingerprinting Explained: From Handshakes in TLS 1.2/1.3 to JA3, JA4, HTTP/2 Analysis and uTLS Evasion
The article provides an in-depth examination of how TLS handshakes reveal client identity even before any HTTP data is sent. It traces the evolution from early SSL versions developed by Netscape to modern TLS 1.3, highlighting how elliptic curve cryptography and AEAD ciphers reduced latency while increasing observability challenges for defenders. Detailed breakdowns show why JA3 hashes became unreliable due to GREASE randomization and extension ordering changes, prompting the shift to the more robust JA4+ family that uses sorted, GREASE-resistant blocks for stable fingerprints. The piece also covers HTTP/2 fingerprinting signals and practical tools such as uTLS in Go for mimicking browser TLS stacks and Finch for traffic analysis. Real Wireshark captures of Client Hello packets to GitHub illustrate how Cloudflare and WAF systems detect scripted clients despite matching User-Agent headers. Overall, the content serves as both a historical overview and a hands-on guide for security engineers working on bot mitigation and traffic obfuscation.
HabrOct 27, 2026Translated from Russian



