tls-fingerprint-impersonation について
impit でブラウザーに合わせた TLS フィンガープリントを使い、HTTP リクエストを送るためのスキルです。フルブラウザーを使わずに、TLS の違いによる応答変化を調べる認可済みテストや API 調査に役立ちます。
主な機能
- 01ブラウザー TLS フィンガープリント設定
- 02JA3/JA4 の検証手順
- 03プロキシと Cookie の設定
- 04HTTP/3 とフォールバック設定
- 05Python、Node.js、Rust での利用
活用シーン
- 01TLS 指紋に関係するブロックの調査
- 02OkHttp プロファイルによるモバイル API のテスト
- 03ブラウザープロファイルごとの応答比較
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ uphiago/ recon-skills --skill tls-fingerprint-impersonationインストール後、Claude Code で/tls-fingerprint-impersonationを入力して読み込まれたか確認します。
詳細
TLS フィンガープリントの偽装
TLS ClientHello のパラメーター(暗号スイート、鍵交換グループ、署名アルゴリズム、拡張機能の順序)を偽装し、JA3/JA4 フィンガープリントレベルで実際のブラウザーに一致させます。パッチ適用済みの rustls を使用し、ブラウザーと同一の設定で TLS レイヤーを再構築します。ブラウザー以外の TLS スタックを検出する TLS フィンガープリント検出(Cloudflare、Akamai、F5)を回避します。Chrome 100-142、Firefox 128-144、Safari iOS 18、OkHttp 3-5(Android)を含む 20 種類のブラウザープロファイルに対応しています。
使用する場面
- 正しい User-Agent ヘッダーを設定しても、curl/httpx への応答で 403 が返される、またはブロックされる場合。
- Cloudflare や Akamai が TLS ClientHello をフィンガープリントしている場合(JA3/JA4 がブラウザーと一致しない)。
- API の調査でモバイルアプリの偽装(Android 用の OkHttp フィンガープリント)が必要な場合。
- フルブラウザーを起動せずに、TLS フィンガープリントのチェックを通過する高スループットな HTTP リクエストが必要な場合。
- TLS フィンガープリントに応じて対象の動作が異なる場合(モバイル用とデスクトップ用のエンドポイント)。
前提条件
- python3 を使用できる
terminal。 - Python:
pip install impit(PyO3 経由で Rust ライブラリをラップします)。 - または Node.js:
npm install impit(ネイティブバインディング)。 - または Rust:Cargo.toml で依存関係にパッチを適用した
impitクレート。
迅速な検出
# Check if a target blocks non-browser TLS
curl --max-time 30 --connect-timeout 10 -sk https://target.com | head -1
# If 403, test with browser impersonation:
python3 -c "
from impit import Impit
impit = Impit.builder().with_fingerprint('chrome142').build()
r = impit.get('https://target.com').text
print(r[:200])
"
手順
フェーズ 1 — ブラウザープロファイルの選択
対象に適したフィンガープリントを選択します。
| プロファイル | 用途 | 主な特徴 |
|---|---|---|
chrome142 | 最新のデスクトップ環境 | 最新の Chrome、耐量子 KEX(X25519MLKEM768)、GREASE |
chrome100 | レガシーシステム | 古い暗号スイート、鍵交換で GREASE を使用しない |
firefox144 | Firefox デスクトップ | 異なる疑似ヘッダー順序、FFDHE グループ、SHA-1 署名 |
safari_ios18 | iOS モバイル | 3DES 暗号、署名アルゴリズムの重複、セッションチケットなし |
okhttp4 | Android アプリ | BoringSSL プロファイル、GREASE なし、ECH なし、シンプルな暗号スイート |
chrome124 | 一般的なデフォルト | 最新環境との互換性と検出回避率のバランスが良好 |
from impit import Impit
# Chrome 142 (latest)
client = Impit.builder().with_fingerprint("chrome142").build()
# Firefox 144
client = Impit.builder().with_fingerprint("firefox144").build()
# Safari iOS 18 (mobile API endpoints)
client = Impit.builder().with_fingerprint("ios18").build()
# OkHttp 4 (Android app impersonation)
client = Impit.builder().with_fingerprint("okhttp4").build()
フェーズ 2 — 基本的なリクエスト
from impit import Impit
impit = (
Impit.builder()
.with_fingerprint("chrome142")
.with_ignore_tls_errors(True) # for self-signed certs during recon
.with_http3() # HTTP/3 support
.with_fallback_to_vanilla(True) # retry without fingerprint if blocked
.build()
)
response = impit.get("https://target.com")
print(response.status_code)
print(response.headers)
print(response.text()[:500])
フェーズ 3 — プロキシの使用
impit = (
Impit.builder()
.with_fingerprint("chrome142")
.with_proxy("http://user:pass@residential-proxy:8080")
.with_default_timeout(15_000) # 15 seconds in milliseconds
.build()
)
response = impit.get("https://target.com/api/endpoint")
フェーズ 4 — カスタムヘッダー
# Custom headers are merged with fingerprint defaults
# Fingerprint headers have lower priority — custom headers win on conflict
response = impit.get(
"https://target.com/api/v1",
headers={
"X-Forwarded-For": "[REDACTED_IP]",
"Authorization": "Bearer token",
}
)
フェーズ 5 — Cookie セッション
from impit.cookie import Jar
impit = (
Impit.builder()
.with_fingerprint("chrome142")
.with_cookie_store(Jar()) # persistent cookie jar
.build()
)
# Login
impit.post("https://target.com/login", json={
"username": "admin", "password": "admin"
})
# Authenticated request — cookies preserved automatically
response = impit.get("https://target.com/dashboard")
フェーズ 6 — フィンガープリント選択ロジック
対象の特徴に基づいて選択します。
def select_fingerprint(target_url):
"""Auto-select browser fingerprint based on target."""
if "mobile" in target_url or "api/v2" in target_url:
return "ios18"
elif "android" in target_url or "play.google" in target_url:
return "okhttp4"
elif target_url.startswith("https://"):
return "chrome142" # default for modern HTTPS
return "chrome124"
フェーズ 7 — JA4 ハッシュの検証
TLS フィンガープリントが正しく機能していることを確認します。
# Test against a site that returns JA4 hash in response headers
python3 -c "
from impit import Impit
impit = Impit.builder().with_fingerprint('chrome142').build()
r = impit.get('https://cloudflare.com/cdn-cgi/trace')
print(r.text())
# Look for JA4 hash in trace output or response headers
"
ブラウザーフィンガープリントのリファレンス
ブラウザーごとの TLS 設定
| 機能 | Chrome 142 | Firefox 144 | Safari iOS 18 | OkHttp 4 |
|---|---|---|---|---|
| TLS バージョン | 1.3 + 1.2 | 1.3 + 1.2 | 1.3 + 1.2 | 1.3 + 1.2 |
| GREASE 暗号 | ✅(位置 1) | ❌ | ✅ | ❌ |
| GREASE 鍵交換 | ✅(位置 1) | ❌ | ✅ | ❌ |
| 耐量子(MLKEM768) | ✅ | ✅ | ✅ | ❌ |
| FFDHE グループ | ❌ | ✅(2048/3072) | ❌ | ❌ |
| SHA-1 署名 | ❌ | ✅ | ✅(レガシー) | ✅(RSA のみ) |
| ECH GREASE | ✅ | ✅ | ❌ | ❌ |
| 3DES 暗号 | ❌ | ❌ | ✅ | ❌ |
| 証明書圧縮 | Brotli | Zlib+Brotli+Zstd | Zlib | ❌ |
| 委任認証情報 | ❌ | ✅ | ❌ | ❌ |
| セッションチケット | ✅ | ✅ | ❌ | ✅ |
| 署名の重複 | ❌ | ❌ | ✅(RsaPssRsaSha384) | ❌ |
ブラウザーごとの HTTP/2 設定
| ブラウザー | ストリームウィンドウ | 接続ウィンドウ | 疑似ヘッダーの順序 |
|---|---|---|---|
| Chrome | 6,291,456 | 15,663,105 | :method :authority :scheme :path |
| Firefox | 131,072 | 12,517,377 | :method :path :authority :scheme |
| Safari iOS | 2,097,152 | 10,485,760 | :method :scheme :authority :path |
| OkHttp | 16,777,216 | 16,777,216 | :method :path :authority :scheme |
マルチパート境界形式
| ブラウザー | 形式 | 例 |
|---|---|---|
| Chrome | ----WebKitFormBoundary + 英数字 16 文字 | ----WebKitFormBoundaryx8fH3kLm9pQr2sTv |
| Firefox | ----geckoformboundary + 16 進数の u64 値 | ----geckoformboundary3fa8c10e5d6b2904 |
| OkHttp | UUID v4 | 550e8400-e29b-41d4-a716-446655440000 |
注意点
- すべてのサイトが TLS フィンガープリントを使用しているわけではありません。 まず curl でテストしてください。動作する場合、TLS フィンガープリントは障害の原因ではありません。
- フィンガープリントは User-Agent と一致している必要があります。 Firefox の UA ヘッダーと Chrome の TLS を組み合わせると検出されます。
- HTTP/1.1 のみをサポートするサイトでは、HTTP/2 の偽装は使用されません。
with_http3()フラグが関係するのは、サイトが HTTP/3 をサポートしている場合のみです。 - OkHttp 3 がサポートするのは TLS 1.2 のみです。 最新のサーバーの中には、TLS 1.2 接続を拒否するものがあります。
- TLS フィンガープリントのキャッシュにより、最初のリクエストに最も時間がかかります。
CryptoProviderインスタンスはフィンガープリントごとにキャッシュされるため、2 回目以降のリクエストは高速です。 - 通常のフォールバックでは、実際の TLS フィンガープリントが漏れる可能性があります。 ステルス性が重要な場合は、
vanilla_fallbackを無効にしてください。
検証
https://www.howsmyssl.com/または Cloudflare のトレースエンドポイントを使用して、TLS フィンガープリントが対象ブラウザーと一致していることを確認します。- Cloudflare で保護されたサイトにアクセスするときは、レスポンスヘッダー
cf-ja4を確認します。 - ブラウザーフィンガープリントを使用した場合に、レスポンスステータスが 403 から 200 に変わることを確認します。通常の curl と比較してください。
- 複数のブラウザープロファイルでテストし、対象の検出を通過するものを見つけます。
関連スキル
http2-header-impersonation— HTTP/2 の疑似ヘッダー順序と SETTINGS フレームの一致。stealth-browser-launch— JS を多用する対象向けの、C++ フィンガープリントパッチを使用した完全なブラウザー自動化。humanize-automation— 振る舞いによる検出を回避する、人間らしいインタラクションパターン。
コメント
Markdown 対応