証明書はコンピューターやユーザーの身分を証明するためのものです。
ただし、インターネット上の身元のわからない相手から提示された証明書の正当なのかどうかわかりません。
通信相手から提示された証明書が、本当に信頼してよいのかを判断するために検証を行います。
今回は、一般的な証明書の検証方法を紹介します。
証明書の正当性を検証する
インターネット上での通信においては、身分を証明するために証明書を提示します。
証明書を受け取った側は、その証明書を信頼してよいのかを判断した上で、処理を続行するか決めます。
それは悪意のあるユーザーの証明書である可能性もあり、その場合は何らかの被害を受けるかもしれません。
例えば、悪意のあるユーザーが VPN 接続できてしまったら、社内ネットワークに侵入されてしまいます。
その際に情報漏洩や資産破損などの被害が発生してしまう危険があります。
また、サーバー証明書を偽装すると、フィッシングサイトを作成することも可能です。
フィッシングサイトの場合、サイトの見た目は有名な EC サイト(amazon など)と同じであることが多いです。
偽装されたサイトとわからずに使用すると、クレジットカードの情報などを盗まれて悪用されてしまう危険があります。
そのため、身分証明書として提示された証明書が信頼に足るものか検証が行われています。
証明書の正当性の検証として、一般的に何を確認しているのか見てみましょう。
証明書の有効期間
証明書には、有効期間が設定されています。
検証したタイミングで、その証明書が有効期間内であるかどうかを確認します。
上の証明書の有効期間は 2021 年 12 月 9 日から 2022 年 3 月 3 日までとなっています。
検証した日が 2022 年 1 月 15 日であれば、有効期間内なので PASS となります。
また、検証した日が 2022 年 5 月 15 日であれば、有効期間外なので FAIL となります。
サブジェクト名
証明書には、サブジェクト名やサブジェクト代替名が設定されています。
サブジェクト名には証明書の持ち主の名前、サブジェクト代替名は別名が記載されています。
この項目の名前をチェックして、持ち主の名前が一致しているかを確認します。
上の証明書のサブジェクト名は *.google.co.jp です。
上の証明書のサブジェクト代替名は *.google.co.jp、google.co.jp です。
Chrome や Edge などの Web ブラウザで確認しているのは、サイトのドメイン名と一致しているかどうかです。
例えば、Google のトップページのドメイン名は www.google.co.jp です。
このサイトのサーバー証明書のサブジェクト代替名の DNS 名が一致しているかを確認します。
失効確認
証明機関は発行した証明書が利用されないように、証明書を失効させることができます。
証明書が失効されている場合、リスクのある証明書である可能性があり、信頼するべきではありません。
そのため、証明書が発行元の証明機関から失効されていないかを確認します。
証明機関は失効している証明書の一覧として CRL を公開しています。
証明機関の CRL の公開先は、[CRL 配布ポイント](CDP)に記載されております。
CDP の URL から CRL をダウンロードし、検証中の証明書が含まれていないかを確認します。
CRL に検証中の証明書のシリアル番号が含まれていたら、その証明書は失効されています。
証明書チェーンの検証
信頼された証明機関から発行された証明書を保持しているのは、身元の信頼性が証明されたことになります。
サードパーティーの証明機関は証明書を発行する際に、身元調査を実施しています。
そのため、悪意のあるユーザーや組織には、信頼された証明機関は証明書を発行しません。
証明書チェーンの検証により、証明書が信頼された証明機関から発行されていることを確認します。
証明書チェーンとは、ルート証明機関、中間証明機関から発行された証明書までの繋がりのことです。
証明書ファイルの [証明のパス] のタブから確認できます。
証明書チェーンの情報より、発行元の証明機関を確認することができます。
そのため、チェーンをたどって最上位にあるルート証明機関が信頼されたものであるかを確認します。
証明機関が証明書を発行する時、デジタル署名を付与しています。
このデジタル署名は、証明書のデータのハッシュ値を算出し、証明機関の秘密鍵で暗号化したデータです。
デジタル署名を検証する際、証明機関の公開鍵で復号して、証明書のデータのハッシュ値の比較を行います。
証明機関の公開鍵は、CA 証明書に付与されています。
ハッシュ値が一致している場合、証明書はその証明機関から発行されたこと、改ざんされていないことが証明されます。
ルート証明書が信頼できていれば、証明書チェーン上の証明書の信頼性は確認されます。
そのため、証明書チェーンをたどって、ルート証明書が信頼されているかをチェックします。
Windows では、[信頼されたルート証明機関] の証明書ストアに登録されていれば、信頼できるルート証明書です。
ルート証明書は “ルート証明書更新プログラム” の機能で自動管理されています。
Web サイトで利用されているサーバー証明書や、アプリケーションのインストーラーに付与されているコード署名を信頼する時、証明書の検証が行われます。証明書を検証する時、信頼できる証明機関から発行された証明書であるかどうかを確認します。この時、[…]
署名ハッシュ アルゴリズム
証明書のデジタル署名の署名ハッシュ アルゴリズムの脆弱性の有無を確認します。
これにより証明機関から発行されたこと、発行された証明書が改ざんされていないことが保証されます。
証明書には、デジタル署名の生成に使用したアルゴリズムが記載された項目があります。
署名アルゴリズムは、公開鍵暗号とハッシュ関数の組み合わせとなります。
MD5 や SHA1 など脆弱性が見つかっているハッシュ関数もあります。
ハッシュ関数に脆弱性が見つかっていると、デジタル署名の信頼性が揺らぎます。
そのため、脆弱性のある署名アルゴリズムかどうかを確認します。
最後に:証明書の検証とは
この記事では、5 つの証明書の正当性の検証方法を紹介しました。
証明書の検証という観点で注意しておく点は以下の 2 点です。
- 証明書の確認項目はアプリケーションの実装で異なる
- 証明書の検証に失敗した時の処理はアプリケーションの実装で異なる
例えば、以下の疑問をもったとします。
例えば、Chrome にて接続先のサイトのサーバー証明書の有効期限が切れていたとします。
その際、以下のように有効期限が切れていることを警告する画面が表示されます。
ただし、ユーザーがサイトへの接続を希望すれば、そのままサイトに接続できます。
これはユーザーがそのまま証明書を認知する形でサイトに接続を許可したことになります。
つまり完全に証明書が利用できなくなったということではありません。
証明書の何の項目をチェックするのかもアプリケーションによって異なります。
また、チェックした結果、信頼性を確認できなかった場合に、どのような処理にするかも異なります。
そのため、「証明書を検証の処理は製品ごとに異なるよ」ってことを覚えておきましょう。