HTTPSの証明書は何を確認している? ― TLS接続の入口をシーケンス図で見る

ネットワーク・RFCカテゴリを表すパンダのイラスト ネットワーク・RFC

この記事について
この記事はTLS 1.3とサービス名検証の現行RFCを確認し、HTTPSでサーバー証明書が果たす役割を整理しています。

検証ステータス:📘 公式仕様確認済み・公開サイト観察は未固定
TLS実装やブラウザ表示は環境で異なるため、特定製品の画面ではなくプロトコル上の役割を中心に説明します。

HTTPSのサーバー証明書は、「通信を暗号化するファイル」そのものではありません。TLS接続の中で、接続先の名前と公開鍵を結び付け、信頼できる認証局へつながる証明書チェーンを使って、相手サーバーのidentityを検証する材料になります。

TLSではその検証と鍵合意を組み合わせ、通信に使うsession keyを確立します。

TLS 1.3の流れを大きく見る

sequenceDiagram
    participant C as Client
    participant S as HTTPS Server

    C->>S: ClientHello
    S-->>C: ServerHello
    S-->>C: Certificate
    S-->>C: CertificateVerify
    S-->>C: Finished
    C->>C: 証明書・名前・署名等を検証
    C-->>S: Finished
    Note over C,S: 暗号化されたapplication data

実際のTLS 1.3 handshakeには条件による違いがありますが、「証明書を受け取る → identityと証明書チェーンを検証 → serverが秘密鍵を持つことを確認 → handshakeを完了」という関係を押さえると全体を理解しやすくなります。

証明書で何を確認するのか

代表的な観点は次です。

  • 接続しようとしているservice名と証明書のidentifierが一致するか

  • 証明書の有効期間などが妥当か

  • 信頼できる認証局へcertificate pathを構築・検証できるか

  • serverが証明書の公開鍵に対応する秘密鍵を持つことをTLS handshakeで示せるか

flowchart TB
    A[Server certificate] --> B[名前の一致]
    A --> C[有効性]
    A --> D[Certificate chain]
    D --> E[Trust storeの信頼 anchor]
    A --> F[CertificateVerify]
    F --> G[対応する秘密鍵を持つことの証明]

URLのホスト名と何を比べるのか

現在のIETF RFC 9525では、service identityのDNS名はsubjectAltNameのdNSNameなど、適切なidentifierと照合する考え方が示されています。

昔の説明でよく出てくるCommon Nameだけを見ればよい、という理解は現在のservice identity検証としては適切ではありません。

Example Domain
↓ reference identifier: www.example.com ↓ certificateのsubjectAltName等と照合

名前が一致しなければ、別の正規な証明書を提示されても「アクセスしようとしたserviceの証明書」とは判断できません。

証明書チェーンとは

server certificateだけを単独で信じるのではなく、issuerをたどり、client側のtrust storeにあるtrust anchorまで検証します。

flowchart TB
    A[Server / Leaf certificate] --> B[Intermediate CA]
    B --> C[Root CA]
    C --> D[Client trust store]

実際のpath buildingやvalidationはより複雑ですが、初心者が最初に持つ図としてはこの関係が分かりやすいです。

証明書があれば通信内容はその公開鍵で全部暗号化される?

TLS 1.3では、certificateの公開鍵を使ってWebページ本文すべてを直接暗号化する、という単純な構造ではありません。

handshakeで鍵合意を行い、そこから得た秘密を使ってapplication dataを保護します。証明書はserver authenticationに重要ですが、session dataの暗号化方式と同一視しない方が正確です。

curlで証明書エラーを見るとき

curlはTLS certificate verificationを行います。名前が合わない、信頼チェーンを構築できない、といった場合はverify errorになります。

通常利用で -k / –insecure を「エラーを消す方法」として常用するのは避けます。

flowchart TB
    A[curl HTTPS] --> B{certificate verification}
    B -->|OK| C[HTTPS requestを継続]
    B -->|NG| D[verify error]
    D --> E[名前・期限・chain・CA設定を調査]
    E -. 安易に検証無効化しない .-> D

検証エラーは邪魔な機能ではなく、接続先のidentityを確認できないことを知らせる安全機構です。

DNSが正しければ証明書も正しい?

DNSで正しいIPへ到達できることと、TLSで接続先のidentityを認証できることは別の層です。

flowchart LR
    A[DNS] --> B[接続先IPを得る]
    B --> C[TCP接続]
    C --> D[TLS handshake]
    D --> E[certificateでservice identityを検証]
    E --> F[HTTP]

層を分けて見ると、DNS障害、TCP疎通、TLS certificate error、HTTP errorを混同しにくくなります。

まとめ

  • サーバー証明書は接続先identityと公開鍵を結び付ける

  • clientは名前、certificate path、有効性などを確認する

  • TLS 1.3ではCertificateVerifyなどを通じてserverの秘密鍵所持も確認する

  • 証明書の公開鍵でWeb本文をそのまま全部暗号化するわけではない

  • DNS、TCP、TLS、HTTPは別レイヤーとして切り分ける

  • certificate verificationを安易に無効化しない

公式情報・一次情報

RFC 8446 — The Transport Layer Security (TLS) Protocol Version 1.3
https://www.rfc-editor.org/rfc/rfc8446.html

RFC 9525 — Service Identity in TLS
https://www.rfc-editor.org/rfc/rfc9525.html

curl — TLS certificate verification
https://curl.se/docs/sslcerts.html

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました