中間証明書が2枚以上あるとき、どの順番に結合すればいいかを確認する方法を解説します。
TLS 証明書の設定でよくあるトラブルの一つが、
「中間証明書を複数使うときの順番が正しいか分からない」 という問題です。
中間証明書が1枚なら迷いませんが、
2枚以上になると「どれを先に置くべきか」がパッと見では判断できません。
やっかいなのが、OpenSSL のコマンドを使うと検証は通るのに、「ブラウザや Java ではエラーになる」という経験をした人もいるのではないでしょうか。
本記事では、実際の検証結果をもとに証明書の順番の確認方法を整理します。
前提:今回扱う証明書構成
今回の例は、中間証明書が2つあるパターンです。
サーバー証明書
↑
中間CA①
↑
中間CA②
↑
ルートCA
- サーバー証明書:検証対象(正当であることを証明したい証明書のこと)
- 中間CA①:サーバー直上の中間
- 中間CA②:ルート直下の中間
- ルートCA:信頼の起点(Trust Anchor)
OpenSSL verify での検証①
正しい順序の中間証明書 + ルートCAで認証⇒認証成功
これは想定どおりの結果です。
OpenSSL は次の順でチェーンを辿ります。
サーバー証明書
→ 中間CA①
→ 中間CA②
→ ルートCA
順に辿り、信頼されたCA(ルート)に到達できるため、検証が成功します。
中間証明書の順番を変えても verify が通ってしまう理由
ややこしいのが次の挙動です。
このように 中間証明書を逆順で並べても、認証成功することがあります。
理由:OpenSSL は順番をいい感じに入れ替えて認証してくれる
OpenSSL は自力で正しいチェーンを再構築してくれます。そのため、並び順が間違っていても、必要な証明書がすべて揃っていれば検証が通ることがあります。
目視で確認する方法
では「正しい順番」はどうやって確認するのか
結論はシンプルです。証明書の詳細情報を目視で確認して、順番を特定します。
✔ 正しい順番の確認方法
- 証明書の Subject(発行先) / Issuer(発行者) を確認する
- サーバー証明書を起点に、Issuer を辿る
- 「ルートCA証明書」にたどり着いたら順番が正しいと分かる
Subject(発行先) / Issuer(発行者)の意味
証明書の詳細は以下のコマンドで確認できます。
(実行結果)
Issuer: 証明書A
Subject:証明書B
(意味)
証明書Aが証明書.crtを発行し、証明書.crtは証明書Bを発行した
上記のような結果が得られます。
関連する証明書の詳細をすべて確認すると、以下のような関連性が見られます。
Issuer(発行者): 中間証明書①
中間証明書①(②が①を認証)
Issuer(発行者): 中間証明書②
Subject(発行先): 中間証明書①
中間証明書②(ルート証明書が②を認証)
Issuer(発行者): ルート証明書
Subject(発行先): 中間証明書②
ルート証明書(自分で自分を認証)
Subject(発行先) = Issuer(発行者)
サーバ設定では必ず正しい順番で連結することが重要です。
目視ではなくコマンドで厳密に順番を確認する方法
目視が不安な場合は、中間証明書を 役割ごとに分けて指定します。
この形にすると、
- 正しい順番 → 認証成功
- 中間CA①と②を逆にする → エラー
となり、順番を機械的に確認できます。
OpenSSL verify での検証②
結果:認証成功
一見すると、「中間CAを -CAfile に入れてしまって大丈夫なのか?」と不安になりますが、OpenSSL 的には問題なく成功します。
なぜこの構成で認証成功するのか。ポイントは -CAfile の意味です。
- -untrusted
信頼はしない
ただしチェーン構築には使ってよい - -CAfile
ここに含まれる証明書に到達したら検証完了
今回のケースでは、
→ 中間CA① (-untrusted)
→ 中間CA② (-CAfile)
と辿れた時点で、
OpenSSL は 「信頼された証明書に到達した」 と判断します。
記事冒頭では、以下のコマンドで「誤った順番に中間証明書を並べても認証通る」状態でした。
一方、
このように2つの中間証明書を別々のファイルとして指定することにより、
明示的に検証の順番を指定することができます。
もしも、中間証明書①と②を逆にすると、想定通りエラーとなります。
おわりに
openssl verify は便利ですが、「なぜ通ったのか」を理解しないと思わぬエラーが発生します。
複数の中間証明書を扱うときは、
- verify の結果
- 証明書の中身(Subject / Issuer)
この両方を見て、
正しい順番を自分で確認することが大切です。

