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

- 中間証明書（intermediate certificate）の役割
- 配置漏れが起こす「ブラウザ別エラー」の仕組み
- Nginx / Apache での正しい配置
- 確認コマンドと典型的な間違い

## 中間証明書とは

![証明書チェーンの構造](/blog/chukan-shomeisho-no-wana/chain-structure.svg)

SSL 証明書はブラウザがルート CA まで辿れて初めて信頼されます。チェーン構造は:

```
ルート CA（ブラウザに最初から入っている）
  ↓ 署名
中間 CA（中間証明書、intermediate certificate）
  ↓ 署名
御社のサイト証明書（end-entity certificate）
```

ブラウザは「サイト証明書 → 中間 CA → ルート CA」と辿って信頼チェーンを作ります。**中間証明書がサーバから配信されない**と、ブラウザは「ルート CA まで辿れない」状態になります。チェーンが途切れたときの切り分けと修復は [SSL chain incomplete の原因と修復手順](/blog/ssl-chain-incomplete-troubleshoot) で詳しく解説しています。

## なぜ「ブラウザによって違う」のか

- **Chrome**: 過去に他サイトでアクセスして中間証明書をキャッシュしている場合、配信なしでも検証成功（**自動取得機能 AIA Fetching**）
- **Firefox**: 同様だが Chrome より厳格
- **Safari**: AIA Fetching の挙動がバージョンで異なる
- **Android（古い WebView）**: AIA 非対応で警告
- **業務用ブラウザ（Edge Legacy / IE）**: 厳格

結果として「**自分の Chrome では見えるが、お客様から『見られない』とクレーム**」という分散障害が起きます。

## Nginx での正しい配置

### 間違った配置（中間証明書を別ファイルにしている）

```nginx
ssl_certificate /etc/ssl/example.co.jp.crt;       # サイト証明書のみ
ssl_certificate_key /etc/ssl/example.co.jp.key;
# 中間証明書は何もしていない → 一部ブラウザで NG
```

### 正しい配置（フルチェーン .crt ファイル）

中間証明書を含む **fullchain.pem** を作成して指定:

```bash
cat example.co.jp.crt intermediate.crt > fullchain.crt
```

```nginx
ssl_certificate /etc/ssl/fullchain.crt;
ssl_certificate_key /etc/ssl/example.co.jp.key;
```

**Let's Encrypt** を certbot で取得した場合は `fullchain.pem` が自動生成されているのでそれを使う:
```nginx
ssl_certificate /etc/letsencrypt/live/example.co.jp/fullchain.pem;
```

## Apache での正しい配置

### 古い書式（Apache 2.4.7 以前）

```apache
SSLCertificateFile /etc/ssl/example.co.jp.crt
SSLCertificateKeyFile /etc/ssl/example.co.jp.key
SSLCertificateChainFile /etc/ssl/intermediate.crt  # ← 別途指定
```

### 推奨（Apache 2.4.8 以降）

```apache
SSLCertificateFile /etc/ssl/fullchain.crt   # サイト + 中間を 1 ファイル
SSLCertificateKeyFile /etc/ssl/example.co.jp.key
```

`SSLCertificateChainFile` は非推奨。`SSLCertificateFile` にフルチェーンを指定する方が将来互換。

## 確認コマンド

![確認コマンドと判定](/blog/chukan-shomeisho-no-wana/check-commands.svg)

### コマンドラインから

```bash
echo | openssl s_client -connect example.co.jp:443 -servername example.co.jp 2>/dev/null | grep -E '^(s|i):'
```

`s:` がサイト証明書、`i:` が発行者。ルート CA まで辿れる行が含まれていれば OK。

### 中間証明書のみ確認

```bash
openssl s_client -showcerts -connect example.co.jp:443 -servername example.co.jp < /dev/null 2>/dev/null | awk '/BEGIN CERT/,/END CERT/'
```

返ってくる証明書が **2 つ以上**（サイト + 中間）なら OK。1 つなら配置漏れ。

### オンラインツール

- SSL Labs: 「Chain issues」セクションをチェック
- ドメイン番人 [SSL 単発チェック](/ssl/check): 中間証明書の有無を含む点検

## 典型的な間違い

### 1. 認証局のサイトで「サーバ証明書のみ」をダウンロード

国内 CA（Cybertrust / GMO グローバルサイン等）の管理画面で、**「サーバ証明書」と「中間証明書」が別ファイルでダウンロード**できます。両方をダウンロードして連結する必要あり。

### 2. 中間証明書の世代が古い

CA は中間 CA を更新します（数年に 1 回）。古い中間証明書を使い続けると、新しい証明書の検証で**古い中間 CA が見つからない**事故が起きます。新規発行時は **必ず最新の中間証明書を使用**。

### 3. 連結順を間違える

`サイト証明書 → 中間証明書` の順で連結（**サイトが上**）。逆だと一部実装で検証失敗。

```bash
# 正しい
cat example.co.jp.crt intermediate.crt > fullchain.crt
# 間違い
cat intermediate.crt example.co.jp.crt > fullchain.crt  # NG
```

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

[SSL 単発チェック](/ssl/check) で中間証明書の有無を 30 秒で確認できます。

中間証明書配置 / Let's Encrypt 自動更新 / OCSP Stapling まで含めた点検は [SSL 棚卸し＋自動更新セットアップ](/contact)（5 万円〜）でご相談ください。

関連記事: [OCSP Stapling とは](/blog/ocsp-stapling-toha) / [SSL Labs A+ 取得ガイド](/blog/ssl-labs-a-plus-shutoku) / [HSTS の設定方法](/blog/hsts-settei-houhou)

メール認証や Web セキュリティヘッダの単発チェックも合わせて [無料ツール一覧](/tools) にまとめています。
