複数の中間証明書を使用するときに、正しい順番を確認する方法

目次

 

中間証明書が2枚以上あるとき、どの順番に結合すればいいかを確認する方法を解説します。

TLS 証明書の設定でよくあるトラブルの一つが、
「中間証明書を複数使うときの順番が正しいか分からない」 という問題です。

中間証明書が1枚なら迷いませんが、
2
枚以上になると「どれを先に置くべきか」がパッと見では判断できません。

 やっかいなのが、OpenSSL のコマンドを使うと検証は通るのに、「ブラウザや Java ではエラーになる」という経験をした人もいるのではないでしょうか。

本記事では、実際の検証結果をもとに証明書の順番の確認方法を整理します。

前提:今回扱う証明書構成

今回の例は、中間証明書が2つあるパターンです。

サーバー証明書
  
中間CA
   ↑
中間CA
   ↑
ルートCA

  • サーバー証明書:検証対象(正当であることを証明したい証明書のこと)
  • 中間CA①:サーバー直上の中間
  • 中間CA②:ルート直下の中間
  • ルートCA:信頼の起点(Trust Anchor

OpenSSL verify での検証

正しい順序の中間証明書 + ルートCAで認証⇒認証成功

$ openssl verify -untrusted [中間CA① → 中間CA②] -CAfile [ルートCA] [サーバー証明書]

これは想定どおりの結果です。

 OpenSSL は次の順でチェーンを辿ります。

サーバー証明書
中間CA①
中間CA②
ルートCA

順に辿り、信頼されたCA(ルート)に到達できるため、検証が成功します。

 中間証明書の順番を変えても verify が通ってしまう理由

ややこしいのが次の挙動です。

$ openssl verify -untrusted [中間CA② → 中間CA①]順番が逆) -CAfile [ルートCA] [サーバー証明書]

このように 中間証明書を逆順で並べても、認証成功することがあります

 理由:OpenSSL は順番をいい感じに入れ替えて認証してくれる

OpenSSL 自力で正しいチェーンを再構築してくれます。そのため、並び順が間違っていても、必要な証明書がすべて揃っていれば検証が通ることがあります。

目視で確認する方法

では「正しい順番」はどうやって確認するのか

結論はシンプルです。証明書の詳細情報を目視で確認して、順番を特定します。

✔ 正しい順番の確認方法

  1. 証明書の Subject(発行先) / Issuer(発行者) を確認する
  2. サーバー証明書を起点に、Issuer を辿る
  3. 「ルートCA証明書」にたどり着いたら順番が正しいと分かる
 Subject(発行先) / Issuer(発行者)の意味

証明書の詳細は以下のコマンドで確認できます。

$ openssl x509 -in 証明書.crt -text
(実行結果)
Issuer: 証明書A
Subject:証明書B
(意味)
証明書Aが証明書.crtを発行し、証明書.crtは証明書Bを発行した

 上記のような結果が得られます。
関連する証明書の詳細をすべて確認すると、以下のような関連性が見られます。

サーバー証明書.crt
Issuer(発行者): 中間証明書①

中間証明書①(②が①を認証)
Issuer(発行者): 中間証明書②
Subject(発行先): 中間証明書①

 中間証明書②(ルート証明書が②を認証)
Issuer(発行者): ルート証明書
Subject(発行先): 中間証明書②

 ルート証明書(自分で自分を認証)
Subject(発行先) = Issuer(発行者)

サーバ設定では必ず正しい順番で連結すること重要です。

 

目視ではなくコマンドで厳密に順番を確認する方法

目視が不安な場合は、中間証明書を 役割ごとに分けて指定します。

$ openssl verify -untrusted [中間CA①] -CAfile   [中間CA② + ルートCA] [サーバー証明書]

この形にすると、

  • 正しい順番認証成功
  • 中間CA①を逆にするエラー

となり、順番を機械的に確認できます。

 OpenSSL verify での検証②

$ openssl verify -untrusted [中間証明書1段目] -CAfile [中間証明書2段目 + ルートCA証明書] サーバー証明書

結果:認証成功

一見すると、「中間CA -CAfile に入れてしまって大丈夫なのか?」と不安になりますが、OpenSSL 的には問題なく成功します

なぜこの構成で認証成功するのか。ポイントは -CAfile の意味です。

  • -untrusted
    信頼はしない
    ただしチェーン構築には使ってよい
  • -CAfile
    ここに含まれる証明書に到達したら検証完了

今回のケースでは、

サーバー証明書
中間CA   (-untrusted)
中間CA   (-CAfile)

と辿れた時点で、
OpenSSL
「信頼された証明書に到達した」 と判断します。 

記事冒頭では、以下のコマンドで「誤った順番に中間証明書を並べても認証通る」状態でした。

$ openssl verify -untrusted ca.pem -CAfile root.pem server.pem

 一方、

$ openssl verify -untrusted [中間証明書①] -CAfile [中間証明書② + ルートCA証明書] サーバー証明書

このように2つの中間証明書を別々のファイルとして指定することにより、
明示的に検証の順番を指定することができます。

もしも、中間証明書①と②を逆にすると、想定通りエラーとなります。

 

おわりに

openssl verify は便利ですが、「なぜ通ったのか」を理解しないと思わぬエラーが発生します

複数の中間証明書を扱うときは、

  • verify の結果
  • 証明書の中身(Subject / Issuer

この両方を見て、
正しい順番を自分で確認することが大切です。