TLSの指紋とは何ですか?
TLS指紋は、暗号化された接続を開始する方法に基づいてクライアントを識別するパッシブ検出技術です。 スクレーパー、ブラウザ、またはHTTPライブラリがHTTPS上でWebサイトに接続されるたびに、特定の順序で暗号スイート、拡張機能、楕円曲線、およびその他のパラメータを含むTLS ClientHelloメッセージが送信されます。 アンチボットシステムは、接続クライアントが、そのユーザーエージェントのクレームと一致するかどうかを判断するために、このハンドシェイクを分析します。
いいね! ブラウザの指紋, これは、JavaScript の実行を必要とする, TLS の指紋は、ネットワーク レイヤーで動作します。 - 任意のページ コンテンツが配信される前に. これにより、私たちのカバーされているように、最も早期および最も困難な検出信号が蒸発するようになります。 アンチボットシステムがプロキシを検出する方法に関する包括的なガイド. .
TLSハンドシェイクの仕組み
HTTP データを HTTPS 上で交換する前に、クライアントとサーバーは TLS ハンドシェイクを実行します。 重要な最初のメッセージ — ClientHello — には、指紋処理に必要なすべてのアンチボットシステムが含まれています。
- TLSバージョン: クライアントがサポートする最大TLSバージョン(TLS1.2、TLS1.3など)
- Cipherスイート: クライアントが使用することを望んでいる暗号化アルゴリズムの注文リスト。
- 延長: Server Name Indication(SNI)、ALPN、シグネチャアルゴリズム、キー共有グループなどの追加機能
- 楕円曲線: キー交換(例:x25519、secp256r1)のカーブタイプに対応。
- 圧縮方法: 典型的には現代の実装ではnullが、その存在または欠如はまだ信号です。
各 HTTP ライブラリ、ブラウザ、プログラミング言語のランタイムは、異なる ClientHello パターンを生成します。 Chrome、Firefox、Safari、Pythonの requests, 行く net/httpNode.js はそれぞれ認識可能な署名を持っています。
JA3の指紋
JA3は最も広く展開されているTLSの指紋方法です。 Salesforce のエンジニアによって開発され、ClientHello メッセージの 5 つの分野から MD5 のハッシュを作成します。
| フィールド | コンテンツ | 例値 |
|---|---|---|
| TLSバージョン | 提供されるプロトコルバージョン | 771 (TLS 1.2), 772 (TLS 1.3) |
| Cipher Suites, オーストラリア | 暗号スイートコードの注文リスト | 4865-4866-4867-4259-49199 ... |
| エクステンション | 拡張子型コードの一覧 | 0-23-65281-10-11-35-16-5... |
| 楕円曲線 | 名前付きグループをサポート | 29-23-24 |
| ECポイントフォーマット | サポートされているポイント形式の種類 | 0 の 0 |
これら5つの値は、コンマとハッシュされ、32文字のJA3指紋を生成します。 例えば、Pythonの requests ライブラリは、同じユーザエージェントの文字列を設定しても、Chromeよりも異なるJA3ハッシュを生成します。
実践におけるJA3検出
# 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 — 次世代
JA4、また、Salesforceから、より読みやすく、堅牢な指紋を生成することにより、JA3で改善します。 不透明なMD5ハッシュの代わりに、JA4は3つのコンポーネントで構造化された識別子を作成します。
- JA4 aの: プロトコル タイプ + TLS バージョン + SNI プレゼンス + 暗号カウント + 拡張カウント + ALPN ファースト値 (例: "t13d1517h2 8daaf6152771 b082dd1658")。
- JA4 bの: サイファースイートのトランクされたハッシュをソートしました。
- JA4 c: 拡張機能(SNIとALPNで分散性を低下させる)の調整されたハッシュをソートしました。
JA4は、追加の信号を組み込んで、単純なハッシュマッチングに抵抗するフォーマットを使用するため、スプーフィングが困難です。
顧客による共通TLSの指紋
| クライアント | TLSライブラリー | 認識可能なトレイト | 検出リスク |
|---|---|---|---|
| クロム(最新) | ボーリングSSL | 特定の暗号注文、GREASE値、ECHサポート | 低(正しく一致する場合) |
| フォレックス | NSSについて | 異なる暗号の好み、委任された資格情報延長 | 低(正しく一致する場合) |
| Pythonリクエスト | OpenSSL (urllib3 経由) | GREASE、いくつかの拡張子、OpenSSL暗号注文を見逃す | 非常に高い |
| ネット/http | 暗号/tls に行く | ユニークな暗号注文、多くの拡張子を欠落させる | 非常に高い |
| Node.js(アキオ/ゴット) | OpenSSL(ノード経由) | ノード固有の拡張注文、欠落したGREASE | 高い |
| ログイン | Varies (OpenSSL/NSS/etc.) は、 | ビルドに依存しますが、通常は非ブラウザの指紋 | 高い |
なぜ TLS の指紋は Evade に堅いです
TLS の指紋は他の検出方法と比較する独特な挑戦を示します:
- ネットワーク層の検出: 任意のHTTPコンテンツが交換される前に動作するので、JavaScriptインジェクションやヘッダ操作で敗北することはできません。
- ライブラリレベルのシグネチャ: 指紋は、アプリケーションコードではなく、ランタイムにコンパイルされたTLSライブラリによって決定されます。 ユーザエージェントの文字列を変更すると、TLS の指紋にゼロ効果があります。
- プロキシの透明性: 標準的な HTTP/HTTPS プロキシ (を含む) 住宅のプロキシ) クライアントからサーバーに渡る TLS ハンドシェイクを転送するので、オリジンはクライアントの実際の TLS フィンガープリントを参照してください。
- 版のカップリング: TLSライブラリの各マイナーバージョンは、少し異なる指紋を生成し、バージョンの不一致を検出可能にします。
TLS 指紋ミチグレーション戦略
1。 ブラウザグレードのTLSライブラリを使用する
最も効果的なアプローチは、ブラウザ識別の ClientHello メッセージを生成する TLS ライブラリを使用することです。
# 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. 行くのutlsを使用して下さい
// 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. カスタムTLSでNode.jsを使う
// 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。 ヘッドレスブラウザを使用する
ヘッドレスブラウザ(Puppeteer、Playwright)は、実際のブラウザTLSスタックを使用するため、本物のブラウザTLS指紋を生成します。 これは最も信頼性の高い緩和ですが、最もリソース集中的です。 ガイドを見る ブロックせずにスクレイピング セットアップの詳細のため。
TLS の指紋のテスト
スクレーパーをデプロイする前に、TLS の指紋を検知サービスから確認します。
# 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')}")
TLS の指紋は、プロキシではなく HTTP クライアントライブラリによって決定されます。 データセンターから住宅用プロキシへの切り替えは、あなたのIPの評判を変更しますが、TLSの署名を変更しません。 どちらのレイヤーもアドレス指定する必要があります。
HTTP/2 の指紋
TLS を超えて、HTTP/2 プロトコル自体は、接続設定、ヘッダフレームの注文、優先フレームを通してクライアントのアイデンティティを明らかにします。 アンチボットシステムは、TLS と HTTP/2 指紋を組み合わせて、より精度が高い:
| HTTP/2信号 | それが明らかにするもの |
|---|---|
| フレーム値の設定 | 初期ウィンドウサイズ、最大同時ストリーム — クライアントによって異なる |
| WINDOW UPDATE サイズ | フロー制御の増分値 — 各実装に一意 |
| ヘッダーフレーム注文 | Pseudo-header オーダー (:method, :authority, :scheme, :path) |
| PRIORITYフレーム | 依存度と重みをストリーミング — ブラウザ固有のパターン |
図書館のような curl_cffi そして、 got-scraping TLS の指紋に加えて HTTP/2 の指紋をアドレスします。
TLS の移行をプロキシ回転と組み合わせる
有効な反検出の作戦の層TLSの指紋との一致 高品質のプロキシ回転: : :
- TLS をユーザエージェントにマッチ: ユーザエージェントがChromeを主張する場合、TLSの指紋はChromeと一致しなければなりません。
- 住宅のプロキシを使用して下さい: ProxyHatの住宅用プロキシ ブラウザレベルの TLS 署名を補完するクリーンな IP を提供します。
- 一貫して回転: 各セッションは、マッチングIP + TLSプロファイル+ユーザーエージェントの組み合わせを使用する必要があります。
- 混合ライブラリを避ける: 異なるTLS指紋で同じIPを再利用しないでください。これは強力なボット信号です。
- 導入前のテスト: テストエンドポイントを使用して、指紋が要求されたブラウザにマッチすることを確認します。
言語固有のプロキシ統合については、ガイドを参照してください。 フィードバック, ノード.jsと おすすめ. .
倫理的および法的考慮事項
TLSの指紋の模倣品は責任をもって使用されるべきです。 正当なユースケースには以下が含まれます:
- 一般的なHTTPS接続によるパブリックなデータへのアクセス
- 自分のインフラのセキュリティ調査と浸透テスト
- 自動テストを正確に実行すると、実際のブラウザの動作をシミュレートできます。
- TLSの指紋がユーザーの追跡にどのように影響するかを調べるプライバシー調査
ウェブサイトの利用規約、料金制限、適用規則を常に尊重します。 詳しくはこちら ProxyHatのドキュメント 責任ある使用法の指針のため。






