Scraper của bạn gửi header Chrome hoàn hảo, chạy sau một IP dân cư sạch, mà vẫn nhận 403 ngay yêu cầu đầu tiên. Không captcha, không trang challenge, không gì để giải. Trang web đã nhận diện bạn trước khi một byte HTTP nào được trao đổi — trong lúc bắt tay TLS.
Bài viết này giải thích cách fingerprinting JA3 và JA4 thực sự hoạt động, vì sao chúng là cỗ máy thầm lặng của mọi hệ thống anti-bot lớn trong năm 2026, và cách xem dấu vân tay của chính bạn trong mười giây. Nếu bạn muốn công cụ vượt qua trước, chúng tôi đã trình bày trong Vượt qua fingerprinting TLS với curl_cffi & tls-client — đây là bài đồng hành về cách phía phát hiện hoạt động.
Trước khi đến lý thuyết, hãy nhìn vào cú bắt tay của chính bạn. Mở trình kiểm tra JA3/JA4 miễn phí của chúng tôi — nó vọng lại dấu vân tay TLS mà client của bạn vừa trình ra và cho biết nó khớp với cái gì:
# From a terminal - see what curl's TLS looks like:
curl https://www.jibaoproxy.com/tools/fingerprint.html
# Then open the same URL in Chrome and compare.
Chạy cả hai và bạn sẽ thấy điểm mấu chốt của toàn bộ bài viết này: curl và Chrome tạo ra những dấu vân tay hoàn toàn khác nhau, bất kể bạn đặt header User-Agent nào.
Mọi kết nối HTTPS đều bắt đầu bằng một thông điệp ClientHello, gửi ở dạng rõ trước khi bất kỳ mã hóa nào bắt đầu. Trong đó, client của bạn công bố:
Đây là điểm cốt lõi của việc phát hiện: các danh sách này và thứ tự chính xác của chúng được khắc sẵn vào thư viện TLS mà client của bạn được biên dịch dựa trên đó. BoringSSL của Chrome công bố một tổ hợp cụ thể. OpenSSL của Python công bố một tổ hợp khác. crypto/tls của Go là cái thứ ba. Bạn không thể thay đổi điều này bằng header — nó được thương lượng bên dưới lớp HTTP, bởi chính thư viện.
JA3 (Salesforce, 2017) nối năm trường ClientHello — phiên bản TLS, cipher, tiện ích mở rộng, đường cong, định dạng điểm — thành một chuỗi rồi băm MD5:
771,4865-4866-4867-49195-49199,0-23-65281-10-11-35-16,29-23-24,0
|
v MD5
cd08e31494f9531f560d64c695473da9
Một hash cho mỗi stack TLS. Mọi bản Chrome 137 trên Windows tạo ra (gần như) cùng một JA3; mọi python-requests trên OpenSSL 3.x tạo ra cùng một JA3 khác. Bên phòng thủ duy trì các bảng tra cứu: hash X = Chrome, hash Y = requests, hash Z = bot Go. Nếu User-Agent nói Chrome nhưng JA3 nói OpenSSL, bạn bị chặn — ngay lập tức, âm thầm, rẻ tiền.
JA3 có vấn đề: Chrome bắt đầu ngẫu nhiên hóa thứ tự tiện ích mở rộng năm 2023 (làm hỏng JA3 ngây thơ), và MD5 thì vô cấu trúc — một hash chẳng nói gì về vì sao hai client khác nhau. JA4 (FoxIO, 2023) khắc phục cả hai và là thứ mà các nhà cung cấp nghiêm túc chạy hôm nay:
JA4 = t13d1516h2_8daaf6152771_b0da82dd1658
| | |
a: protocol b: ciphers c: extensions
(TLS 1.3, 16 ciphers, (sorted, truncated
h2 ALPN, domain SNI) SHA256)
Mọi hệ thống quan trọng: Cloudflare phơi bày JA3/JA4 trực tiếp trong các quy tắc quản lý bot của nó; DataDome và PerimeterX đưa nó vào chấm điểm lớp mạng của họ (xem hướng dẫn DataDome/PerimeterX của chúng tôi); Akamai đã chạy fingerprinting TLS lâu hơn bất kỳ ai. Nó phổ biến vì tính toán miễn phí, không thể giả mạo từ lớp HTTP, và bắt được 90% tự động hóa ngây thơ — mọi script requests/httpx/axios/Go-http từng được viết — trước khi bất kỳ JavaScript nào cần chạy.
Điều này khiến nhiều người ngạc nhiên: một proxy thay đổi IP của bạn, nhưng cú bắt tay TLS của bạn đi qua mà không thay đổi. Đường hầm CONNECT (hay luồng SOCKS5) mang các byte ClientHello của bạn nguyên văn đến mục tiêu. IP dân cư + JA3 thư viện-requests = "một bot chạy trên một IP dân cư." Tốt hơn IP trung tâm dữ liệu, vẫn là một bot.
IP và dấu vân tay TLS là các tín hiệu độc lập và bạn cần cả hai đều sạch:
| IP | Dấu vân tay TLS | Phán quyết trong năm 2026 |
|---|---|---|
| Trung tâm dữ liệu | Thư viện (requests/Go) | Bị chặn ở mọi nơi quan tâm |
| Dân cư | Thư viện | Bị chặn trên các trang kiểm tra JA4 |
| Trung tâm dữ liệu | Giả mạo trình duyệt | Bị chặn vì danh tiếng IP |
| Dân cư | Giả mạo trình duyệt | Vượt qua các kiểm tra lớp mạng |
Hai con đường, tùy theo công cụ:
HTTP client — dùng một thư viện giả mạo tái hiện đúng ClientHello của trình duyệt: curl_cffi (Python), tls-client (Python/Go), got-scraping (Node). Mã hoạt động đầy đủ trong hướng dẫn curl_cffi:
from curl_cffi import requests
r = requests.get(
"https://target.example",
impersonate="chrome",
proxies={"https": "socks5h://USERNAME:[email protected]:913"},
)
Trình duyệt thật (Playwright, browser agent, trình duyệt chống phát hiện) — không có gì phải làm ở lớp TLS; dấu vân tay đúng thật là của Chrome. Rủi ro của bạn nằm ở nơi khác: danh tiếng IP và phát hiện CDP.
Sau đó hãy xác minh, đừng cho rằng đúng. Phiên bản trôi dạt — một thư viện giả mạo bị ghim vào cú bắt tay của Chrome 120 đọc ra như "trình duyệt lỗi thời đáng ngờ" trong năm 2026. Kiểm tra lại sau mỗi lần cập nhật phụ thuộc:
Ghép TLS giả mạo của bạn với IP dân cư — 500MB tín dụng miễn phí, không cần thẻ.
Bắt đầu dùng thử miễn phíNgười dùng mới nhận 500MB khi đăng ký, cùng tiền thưởng cho lần nạp đầu tiên. Ưu đãi có thời hạn.