ドメインモード - TLS/SSL スキャナー
ドメインモード - TLS/SSL スキャナー
完全な証明書チェーン抽出、暗号スイート検出、オプションの PQ 鍵交換検出を伴う TLS ハンドシェイク分析
実装済み - v1.0.0 で利用可能。TLS ハンドシェイクには rustls (ring バックエンド付き)、証明書分析には x509-parser を使用して Rust で構築されています。
概要
ドメインモードは、リモートエンドポイントのアクティブな TLS スキャンを実行します。ターゲットホストに接続し、rustls を介して TLS ハンドシェイクを実行し、完全な証明書チェーン (サーバー証明書、中間証明書、ルート) を抽出します。また、ネゴシエートされた暗号スイートと鍵交換アルゴリズムも検出します。ドメインモードは、WhoisXML API を介したサブドメイン検出と、パケットキャプチャによるオプションのポスト量子鍵交換検出 (X25519MLKEM768、Kyber768) をサポートします。
仕組み
ドメインモードのフロー
TCP 接続
ターゲットホストとポートに接続 (デフォルト: 443)
TLS ハンドシェイク
rustls を介して TLS ハンドシェイクを実行 (TLS 1.2/1.3、ring バックエンド)
チェーン抽出
完全な証明書チェーンを抽出: サーバー + 中間証明書 + ルート
暗号検出
ネゴシエートされた暗号スイートと鍵交換方式を特定
暗号分析
アルゴリズム、鍵サイズ、量子脆弱性を分析
リスクスコアリング
各証明書の量子リスクスコアを計算
機能
TLS 1.2 & 1.3 サポート
ring バックエンド付きの rustls を使用して接続し、TLS 1.2 および TLS 1.3 ハンドシェイクをサポート
完全な証明書チェーン
完全なチェーンを抽出: リーフ (サーバー) 証明書、中間 CA、ルート CA
暗号スイートと鍵交換
ハンドシェイクで使用されるネゴシエートされた暗号スイートと鍵交換アルゴリズムを検出
サブドメイン検出
WhoisXML API を介してサブドメインを検出し、より広範なスキャンカバレッジを実現 (最大数は設定可能)
PQ 鍵交換検出
ポスト量子鍵交換 (X25519MLKEM768、Kyber768) を検出するオプションのパケットキャプチャ
複数の出力形式
JSON、YAML、ターミナルフレンドリー、または HTML 形式の結果
使用方法
基本スキャン
# Scan a single domain on default port 443
dke-scanner-agent domain --target example.com
# Scan with custom port
dke-scanner-agent domain --target api.example.com --port 8443
# Scan with output to file
dke-scanner-agent domain --target example.com --output scan-results.json
コマンドラインオプション
| フラグ | 説明 | デフォルト | 必須 |
|---|---|---|---|
| --target <HOST> | ターゲットのホスト名または IP アドレス | None | はい |
| --port <PORT> | ターゲットのポート番号 | 443 | いいえ |
| --timeout <SECS> | 接続タイムアウト (秒) | 10 | いいえ |
| --discover-subdomains | WhoisXML API を介したサブドメイン検出を有効化 | false | いいえ |
| --subdomain-api-key <KEY> | サブドメイン検出用の WhoisXML API キー | None | いいえ (--discover-subdomains の場合は必須) |
| --max-subdomains <N> | スキャンするサブドメインの最大数 | 10 | いいえ |
| --detect-pq-kex | パケットキャプチャによる PQ 鍵交換検出を有効化 | false | いいえ |
| --interface <NAME> | パケットキャプチャ用のネットワークインターフェース (--detect-pq-kex と併用) | 自動検出 | いいえ |
| --output <FILE> | 出力ファイルパス | stdout | いいえ |
| --format <FMT> | 出力形式: json、yaml、terminal、または html | json | いいえ |
高度な例
アーキテクチャ
ドメインモードは、OpenSSL への依存なしに純粋な Rust の TLS ハンドシェイクを実現するために、ring 暗号バックエンド付きの rustls を使用します。
rustlsクライアント (ring バックエンド、TLS 1.2/1.3) を構築します。- ホストに接続し、TLS ハンドシェイクを実行します。
- 完全な証明書チェーン (サーバー、中間証明書、ルート) を抽出します。
- ネゴシエートされた暗号スイート、鍵交換、プロトコルバージョンを記録します。
--detect-pq-kexが設定されている場合、パケットキャプチャを介してポスト量子鍵交換 (例: X25519MLKEM768) をオプションで検出します。- WhoisXML API を介してサブドメインをオプションで検出し、それぞれをスキャンします。
出力例
{
"scan_metadata": {
"scanner_version": "1.0.0",
"scan_mode": "domain",
"scan_date": "2025-01-30T16:20:15Z"
},
"target": {
"hostname": "api.example.com",
"port": 443,
"ip_address": "93.184.216.34"
},
"tls_info": {
"protocol_version": "TLS 1.3",
"cipher_suite": "TLS_AES_256_GCM_SHA384",
"key_exchange": "X25519"
},
"certificates": [
{
"position": 0,
"type": "leaf",
"subject": "CN=api.example.com",
"issuer": "CN=DigiCert TLS RSA SHA256 2020 CA1",
"serial": "0A1B2C3D4E5F6789",
"not_before": "2024-01-01T00:00:00Z",
"not_after": "2025-12-31T23:59:59Z",
"algorithm": "RSA",
"key_size": 2048,
"signature_algorithm": "SHA256WithRSA",
"is_self_signed": false,
"is_ca": false,
"quantum_vulnerable": true,
"risk_assessment": {
"quantum_risk_score": 8.2,
"priority": "P1",
"severity": "HIGH"
}
},
{
"position": 1,
"type": "intermediate",
"subject": "CN=DigiCert TLS RSA SHA256 2020 CA1",
"issuer": "CN=DigiCert Global Root CA",
"algorithm": "RSA",
"key_size": 2048,
"is_ca": true,
"quantum_vulnerable": true
},
{
"position": 2,
"type": "root",
"subject": "CN=DigiCert Global Root CA",
"issuer": "CN=DigiCert Global Root CA",
"algorithm": "RSA",
"key_size": 2048,
"is_self_signed": true,
"is_ca": true,
"quantum_vulnerable": true
}
]
}
主な制限事項
rustls TLS ライブラリは、X25519 と X25519MLKEM768 の鍵交換をネイティブに区別できません。どちらも rustls API レベルでは X25519 として表示されます。ポスト量子鍵交換を正確に検出するには、指定されたネットワークインターフェースでパケットキャプチャ分析を有効にする --detect-pq-kex フラグを使用してください。
サブドメイン検出は WhoisXML API によって支えられています。--discover-subdomains を使用する場合、--subdomain-api-key を介して有効な API キーを提供する必要があります。無料プランでは、月あたりの API 呼び出し数が制限されています。