メインコンテンツまでスキップ

ドメインモード - TLS/SSL スキャナー

適用対象:
TLS 1.2 / TLS 1.3Certificate Chain ExtractionCipher Suite & Key Exchange DetectionSubdomain Discovery (WhoisXML API)PQ Key Exchange Detectionv1.0.0
ステータス

実装済み - v1.0.0 で利用可能。TLS ハンドシェイクには rustls (ring バックエンド付き)、証明書分析には x509-parser を使用して Rust で構築されています。

概要​

ドメインモードは、リモートエンドポイントのアクティブな TLS スキャンを実行します。ターゲットホストに接続し、rustls を介して TLS ハンドシェイクを実行し、完全な証明書チェーン (サーバー証明書、中間証明書、ルート) を抽出します。また、ネゴシエートされた暗号スイートと鍵交換アルゴリズムも検出します。ドメインモードは、WhoisXML API を介したサブドメイン検出と、パケットキャプチャによるオプションのポスト量子鍵交換検出 (X25519MLKEM768、Kyber768) をサポートします。

仕組み​

ドメインモードのフロー

1

TCP 接続

ターゲットホストとポートに接続 (デフォルト: 443)

2

TLS ハンドシェイク

rustls を介して TLS ハンドシェイクを実行 (TLS 1.2/1.3、ring バックエンド)

3

チェーン抽出

完全な証明書チェーンを抽出: サーバー + 中間証明書 + ルート

4

暗号検出

ネゴシエートされた暗号スイートと鍵交換方式を特定

5

暗号分析

アルゴリズム、鍵サイズ、量子脆弱性を分析

6

リスクスコアリング

各証明書の量子リスクスコアを計算

機能​

1 TLS 1.2 & 1.3 サポート

ring バックエンド付きの rustls を使用して接続し、TLS 1.2 および TLS 1.3 ハンドシェイクをサポート

2 完全な証明書チェーン

完全なチェーンを抽出: リーフ (サーバー) 証明書、中間 CA、ルート CA

3 暗号スイートと鍵交換

ハンドシェイクで使用されるネゴシエートされた暗号スイートと鍵交換アルゴリズムを検出

4 サブドメイン検出

WhoisXML API を介してサブドメインを検出し、より広範なスキャンカバレッジを実現 (最大数は設定可能)

5 PQ 鍵交換検出

ポスト量子鍵交換 (X25519MLKEM768、Kyber768) を検出するオプションのパケットキャプチャ

6 複数の出力形式

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-subdomainsWhoisXML 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、または htmljsonいいえ

高度な例​

アーキテクチャ​

ドメインモードは、OpenSSL への依存なしに純粋な Rust の TLS ハンドシェイクを実現するために、ring 暗号バックエンド付きの rustls を使用します。

  1. rustls クライアント (ring バックエンド、TLS 1.2/1.3) を構築します。
  2. ホストに接続し、TLS ハンドシェイクを実行します。
  3. 完全な証明書チェーン (サーバー、中間証明書、ルート) を抽出します。
  4. ネゴシエートされた暗号スイート、鍵交換、プロトコルバージョンを記録します。
  5. --detect-pq-kex が設定されている場合、パケットキャプチャを介してポスト量子鍵交換 (例: X25519MLKEM768) をオプションで検出します。
  6. 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
}
]
}

主な制限事項​

X25519 と X25519MLKEM768

rustls TLS ライブラリは、X25519 と X25519MLKEM768 の鍵交換をネイティブに区別できません。どちらも rustls API レベルでは X25519 として表示されます。ポスト量子鍵交換を正確に検出するには、指定されたネットワークインターフェースでパケットキャプチャ分析を有効にする --detect-pq-kex フラグを使用してください。

サブドメイン検出には API キーが必要

サブドメイン検出は WhoisXML API によって支えられています。--discover-subdomains を使用する場合、--subdomain-api-key を介して有効な API キーを提供する必要があります。無料プランでは、月あたりの API 呼び出し数が制限されています。

トラブルシューティング​

ベストプラクティス​