← コラム一覧

TLSとサーバ証明書|警告の原因の切り分けとSAN・中間証明書・HSTS

ブラウザに証明書の警告が出たときに、期限・対象名・発行者・経路のどれが原因かを切り分ける方法を解説。SAN による照合、中間証明書を配る理由、失効確認(CRL・OCSP)、HSTS の役割、情報処理安全確保支援士試験での問われ方まで。

TLS は通信の暗号化だけの仕組みではありません。「相手が名乗るとおりの相手か」を確かめる部分が、サーバ証明書の役割です。ブラウザに警告が出たときは、期限・対象名・発行者・経路のどれが原因かを切り分けるところから始めます。「期限が切れたのだろう」と決め打ちすると、別の原因を見落とします。

証明書が保証しているもの

サーバ証明書が保証しているのは、「この公開鍵は、記載されたホスト名のサーバのものである」という結び付きです。暗号化そのものは鍵交換と共通鍵暗号が受け持ちます。証明書があるから通信が安全、ではなく、証明書があるから相手を確かめられる、が正確です。

警告の原因を切り分ける

原因何が起きているか確かめ方
有効期限切れNot After を過ぎている証明書の Validity を見る
対象名の不一致接続先のホスト名が証明書に含まれないSubject Alternative Name を見る
発行者が信頼されない自己署名、または信頼されていない CAIssuer とルート証明書の有無を見る
経路がたどれない中間証明書を提示していないサーバが送出する証明書の並びを見る
失効している失効の手続きが取られているCRL・OCSP で確認する

対象名は CN ではなく SAN で見る

現在のブラウザは、接続先のホスト名を Subject Alternative Name(SAN)と照合します。かつて使われていた Subject の CN は、もはや見られません。新しいホスト名でサービスを公開したのに証明書の対象へ含めていない、という取りこぼしはよく起きます。CN に書き足しても解決しないので、SAN を含めた証明書を発行し直す必要があります。

# 証明書の中身(読める形にしたもの)
Subject: C=JP, O=Example, CN=www.example.co.jp
X509v3 Subject Alternative Name:
    DNS:www.example.co.jp, DNS:example.co.jp
# → shop.example.co.jp で接続すると対象名が一致せず警告になる

中間証明書 — 一部の環境でだけ失敗する不具合

ブラウザは、サーバ証明書からルート認証局まで、証明書の連鎖をたどって検証します。この途中にある中間証明書は、サーバが並べて配るのが原則です。配っていなくても、たまたま中間証明書を手元に持っている環境では検証が通ってしまうため、「一部の端末でだけ警告が出る」という形になり、手元では再現しません。環境の差を疑うべき典型例です。

失効の確認

秘密鍵が漏れたなどの理由で、有効期限内でも証明書を無効にすることがあります。確認の仕組みは二つあり、失効した証明書の一覧をまとめて配る CRL と、その都度問い合わせる OCSP です。CRL は一覧が大きくなり反映が遅れがちで、OCSP は問い合わせ先の可用性と、どのサイトを見たかが知られる点が課題になります。そこで、サーバがあらかじめ取得した応答をまとめて渡す OCSP ステープリングが使われます。

暗号化と本人確認は別の仕事

TLS の中では二つのことが同時に行われています。ひとつは、通信を暗号化するための鍵を安全に共有すること。もうひとつは、相手が名乗るとおりの相手かを証明書で確かめることです。前者だけなら証明書が無くても成立しますが、それでは誰と鍵を共有したのか分かりません。目の前の相手が攻撃者であっても、暗号化された通信は成立してしまいます。証明書の検証は、この「誰と」を埋めるためにあります。

本体のデータの暗号化には共通鍵暗号を使います。公開鍵暗号は処理が重いため、鍵の共有だけに使い、大量のデータは速い方式で扱う——これがハイブリッド暗号方式です。TLS 1.3 では、この鍵の共有の手順が短くなり、往復の回数が減りました。同時に、安全でないとされた方式が削られ、通信の途中で使われた鍵が後から漏れても過去の通信を復号できない性質(前方秘匿性)が前提になっています。

受け付けるプロトコルと、HSTS

TLS 1.0 と 1.1 は既に安全でないとされ、利用が非推奨です。受け付ける最小バージョンを 1.2 以上に設定します。加えて、暗号化しない接続へ誘導されるのを防ぐのが HSTS です。暗号化された接続へリダイレクトするだけでは、最初の一回の要求が経路上で書き換えられうるため、ブラウザに「このサイトへは常に暗号化して接続する」と覚えさせて、その一回を無くします。

min_protocol = TLSv1.2                 # 1.0 / 1.1 は受け付けない
chain_file  = /etc/tls/chain.pem      # 中間証明書を並べて配る
hsts        = on                      # 常に暗号化して接続させる

情報処理安全確保支援士 試験での問われ方

午後問題では、証明書の内容の抜粋とブラウザの警告を並べて「警告の原因」「対処」を書かせる形が多く見られます。原因を一つに決めつけず、記録に残った理由と証明書の中身の両方で裏を取る姿勢が問われます。午前Ⅱでは、公開鍵暗号とディジタル署名の鍵の向き、PKI の役割分担(CA が発行、RA が本人確認、VA が失効状態の応答)、失効確認の仕組みが繰り返し出題されます。

IPA 公式 PDF:令和5年度 秋期 午前Ⅱ問題(問3 で VA の役割が問われた) ↗本文はこの公式 PDF でご覧ください(アプリ内には転載していません)。

確認しておきたいこと

演習(支援士日誌)で手を動かす →