
## この記事でわかること

- CT log（Certificate Transparency）が公開している情報の範囲
- crt.sh と CertSpotter の使い分け
- 自社サブドメインを網羅列挙する具体的なクエリ
- 列挙結果から「使われていないサブドメイン」を絞り込む手順

## CT log とは

![CT log の仕組み](/blog/ct-log-subdomain-enumeration/ct-log-overview.svg)

Certificate Transparency（証明書透明性、RFC 9162）は、世界中の認証局が発行した SSL/TLS 証明書を**公開ログに記録**する仕組みです。Chrome / Edge / Safari などのブラウザは、CT log に登録されていない証明書を信頼しません。

その結果:

- 御社が過去〜現在に発行した**全ての証明書**が CT log で公開されている
- 証明書には **Subject Alternative Name（SAN）**として全サブドメインが記録されている
- 第三者からも「御社が過去にどのサブドメイン名を使ったか」が網羅できる

これは攻撃者の偵察にも使われる情報源です。**自社が把握していないサブドメインを早めに棚卸しすること**が防御の第一歩。

## crt.sh での列挙

[crt.sh](https://crt.sh) は CT log を検索できる無料サービスです。自社棚卸しは crt.sh で十分。

### 基本クエリ（ブラウザ）

```
https://crt.sh/?q=%25.example.co.jp
```

`%25` は URL エンコード済の `%` ワイルドカード。これで `*.example.co.jp` 配下の全サブドメインが取れます。

### JSON API で取得

```bash
curl -s 'https://crt.sh/?q=%25.example.co.jp&output=json' \
  | jq -r '.[].name_value' | sort -u | tee subdomains.txt
```

`name_value` は改行区切りで複数 SAN が入る場合があるので、後段で展開:

```bash
curl -s 'https://crt.sh/?q=%25.example.co.jp&output=json' \
  | jq -r '.[].name_value' \
  | tr ',\n' '\n\n' \
  | sort -u
```

### `&exclude=expired` で失効済を除外

```
https://crt.sh/?q=%25.example.co.jp&exclude=expired&output=json
```

「現役の証明書を持つサブドメイン」のみを優先的に見たい場合に有効。

## CertSpotter（SSLMate）での列挙

![crt.sh と CertSpotter の使い分け](/blog/ct-log-subdomain-enumeration/comparison.svg)

[CertSpotter](https://sslmate.com/certspotter/) は SSLMate 社の CT 監視サービス。crt.sh が応答しない時のフォールバックとして優秀。API の使い方や継続監視の設定は[CertSpotter の使い方](/blog/certspotter-tsukaikata)で解説しています。

### 認証なしで取得

```bash
curl -s 'https://api.certspotter.com/v1/issuances?domain=example.co.jp&include_subdomains=true&expand=dns_names' \
  | jq -r '.[].dns_names[]' | sort -u
```

`include_subdomains=true` がポイント。

### crt.sh との使い分け

| 観点 | crt.sh | CertSpotter |
|---|---|---|
| 取得速度 | ◎（速い時は速い） | ○ |
| 安定性 | △（しばしば 503） | ◎ |
| クエリ柔軟性 | ◎（SQL ライク） | ○ |
| 過去履歴 | ◎ | ◎ |
| API 認証 | 不要 | 不要（無料枠） |

運用では **crt.sh を一次、CertSpotter をフォールバック**にする 2 段構えが安定します。ドメイン番人の [サブドメイン棚卸し 単発チェック](/subdomain/check) も同じパターンで実装しています。

## 列挙後の絞り込み

CT log で得たリストには、現在使っていないサブドメインも含まれます。**「dangling な可能性があるもの」を抽出**するために以下を実行:

### 1. DNS 解決を確認

```bash
for sub in $(cat subdomains.txt); do
  result=$(dig +short $sub)
  echo "$sub : ${result:-(no answer)}"
done
```

応答なしのサブドメインから優先的に調査。

### 2. CNAME 宛先を確認

```bash
for sub in $(cat subdomains.txt); do
  cname=$(dig +short CNAME $sub)
  if [ -n "$cname" ]; then
    echo "$sub → $cname"
  fi
done
```

CNAME が SaaS パターン（`*.herokuapp.com` `*.github.io` `*.netlify.app` 等）に合致するものをマーク。

### 3. SaaS 解約状況を確認

CNAME 宛先 SaaS にアクセスして、解約エラー（"There isn&apos;t a GitHub Pages site here" 等）が返ってきたら **dangling 確定**です。

詳しくは [dangling CNAME のリスクと検出方法](/blog/dangling-cname-risk) を参照してください。

## 攻撃者にも見えていることに注意

CT log は世界中で公開されています。**攻撃者は同じ情報を使って偵察しています**。

- 過去のキャンペーン用サブドメイン
- 退職者が立てた検証環境
- 社内ツールの URL

これらが CT log に**漏れなく記録**されているので、自社が先に棚卸ししないと攻撃者の方が先に dangling を見つけて占有してしまうリスクがあります。

## まずは現状を把握しましょう

ドメイン番人の [サブドメイン棚卸し 単発チェック](/subdomain/check) では、crt.sh + CertSpotter フォールバック + DoH 解決確認 + 既知 SaaS パターンの検出までを 30 秒で実行します。

棚卸しと是正の支援は [サブドメイン棚卸し＋テイクオーバーリスク診断](/contact)（5 万円〜）でご相談ください。

関連記事:
- [サブドメインテイクオーバーとは？仕組みと EC・スタートアップ・制作会社への影響](/blog/subdomain-takeover-toha)
- [dangling CNAME のリスクと検出方法](/blog/dangling-cname-risk)
- [Web 担当者向け サブドメイン棚卸しチェックリスト](/blog/subdomain-audit-checklist-smb)

総合点検は [無料のドメイン診断](/diagnose)、SSL 単独は [SSL 単発チェック](/ssl/check) をご利用ください。
