SSL/TLSとサーバー証明書・クライアント証明書をゼロから理解する
銀行サイトの鍵マークは、何を保証している? 公開鍵は署名に使うの、それとも暗号化に使うの? ひとつの買い物の場面から順番につなげます。
まずは銀行のサイトで考える
スマートフォンで銀行のサイトを開き、残高を確認するとします。ここで心配なのは3つ。①偽の銀行に接続していないか、②残高や暗証情報を盗み見られないか、③送金先を書き換えられないか、です。
①相手は本当に銀行?
②内容を読まれない?
③途中で変更されない?
これらをまとめて実現するのがHTTPSで使われるTLSです。証明書が暗号化そのものをするわけではありません。証明書は主に「誰の公開鍵か」を確かめる材料です。
言葉の全体像:何が何を担当するのか
| 言葉 | 担当 | たとえ |
|---|---|---|
| SSL / TLS | 通信を安全にするプロトコル。現在はTLSが正式な主役 | 安全な通話ルール |
| HTTPS | HTTPをTLSで保護した通信 | 安全な道で開くWebサイト |
| サーバー証明書 | サイト名とサーバー公開鍵を結び付ける | 店の身分証 |
| クライアント証明書 | 利用者・端末側の公開鍵などを証明する | 社員証 |
| 認証局(CA) | 証明書を検証・発行・署名する | 身分証の発行元 |
| 電子署名 | 秘密鍵で署名し公開鍵で検証する | 偽造しにくいサイン |
| 鍵交換 | 通信に使う共通の秘密を両者で導く | 2人だけの合言葉作り |
| 共通鍵暗号 | 大量の通信を高速に暗号化する | 会話を暗号で包む |
鍵には3つの仕事がある
「鍵」とひとことで言っても、登場する鍵は一種類ではありません。ここを分けると急に分かりやすくなります。
A. 署名用の公開鍵・秘密鍵
B. 鍵交換用の一時的な鍵
C. 通信用の共通鍵
たとえばレストランで「店員の身分確認」「お互いの合言葉決め」「合言葉を使った秘密の会話」が別の手順であるのと同じです。
サーバー証明書は「この公開鍵はこのサイトのもの」という説明書
ブラウザが https://bank.example に接続すると、サーバーは自分の証明書を提示します。証明書には、対象のドメイン名(通常はSAN)、公開鍵、発行元、期限、用途などの情報が入っています。秘密鍵は含まれません。
ここで2種類の署名を区別しましょう。認証局による証明書への署名は「この証明書の内容を発行元が保証した」ことを示します。一方、サーバーの秘密鍵によるハンドシェイク署名は「目の前の通信相手が、証明書の公開鍵に対応する秘密鍵を持っている」と示します。役割が違います。
認証局は何をしている?
誰でも「私は銀行です」と書かれた自称の証明書は作れます。それだけでは信用できません。そこで信頼できる認証局(CA)が、証明書の内容を確認したうえで署名します。ブラウザは信頼するルートCAをあらかじめ保持し、サーバー証明書までの署名のつながりを検証します。
OSやブラウザの信頼ストア
ルート/上位CAによる署名で検証
中間CAの署名・サイト名・期限などを検証
ただし「CAが署名した」だけで十分ではありません。アクセスしたドメイン名と一致するか、有効期限・鍵用途・失効情報など、適用される検証条件も確認します。鍵マークは銀行の経営の健全性やWebページの内容の安全性まで保証しません。
HTTPSでは実際に何が起こる?
代表例として、証明書でサーバーを認証するTLS 1.3の通常の新規接続を追ってみます。実際には通信の往復や暗号化開始のタイミングなどが細かく定められていますが、ここでは役割ごとに整理します。
接続の相談
ブラウザがClientHelloを送信し、対応方式と鍵交換用の一時公開値などを提示します。
鍵交換
サーバーがServerHelloなどを返し、双方が(EC)DHEなどからハンドシェイク用の鍵を導きます。
サーバー証明書の提示
サーバーが証明書チェーンを提示。ブラウザがサイト名や信頼経路などを確認します。
サーバーの署名検証
サーバーが秘密鍵でハンドシェイクに署名(CertificateVerify)。ブラウザは証明書の公開鍵で検証します。
通信の開始
Finishedによる検証を経て、導出した共通鍵でHTTPSの本文を認証付き暗号で保護します。
公開鍵は暗号化用?署名用?
答えは「公開鍵暗号技術には両方の用途がある。ただし、同じ鍵・同じ方式を何にでも使うわけではない」です。代表例を区別しましょう。
| 目的 | 鍵と方式 | 具体例 |
|---|---|---|
| 暗号化 | 受信者の公開鍵で暗号化/秘密鍵で復号(対応する方式の場合) | 公開鍵暗号・ハイブリッド暗号 |
| 署名 | 署名者の秘密鍵で署名/公開鍵で検証 | 電子契約・TLS 1.3のCertificateVerify |
| 鍵合意 | 各自の一時秘密値と交換した公開値から共通秘密を導出 | TLS 1.3のECDHE |
| 通信暗号化 | 双方で導いた共通鍵による認証付き暗号 | HTTPSのHTTP本文 |
ここでの鍵交換は、公開鍵でメッセージを暗号化して渡す操作とは異なります。ECDHEは両者が独立に計算して同じ共有秘密を得る鍵合意です。ECDSAやEd25519は署名方式であり、公開鍵暗号の暗号化方式ではありません。
クライアント証明書は何のため?
ふつうのHTTPSでは、ブラウザが「訪問先のサーバー」を確認します。一方、会社の経費精算システムでは「このアクセス元は会社が認めた端末か」も確認したいことがあります。そこでクライアント証明書を使います。
通常のHTTPS(片方向認証)
mTLS(相互TLS認証)
社員証を見せるだけなら写真をコピーできるかもしれません。しかしTLSでは証明書ファイルを持っているだけでなく、対応する秘密鍵で実際に署名できることが必要です。秘密鍵はOSの保護領域やスマートカード、TPMなどに保管されることがあります。
操作して確かめる:どの確認が失敗すると止まる?
以下では「サーバー証明書の名前を不一致にする」「認証局を信頼できなくする」「社員PCの証明書をなくす」などを切り替えてみてください。さらに、署名用公開鍵と通信の共通鍵の役割を切り替えると混同しにくくなります。
銀行のHTTPSと社員専用サイトを比べてみよう
「証明書を確認する」「鍵を使って相手を証明する」「通信を暗号化する」は別の役割です。状況を変えて確かめられます。
ブラウザが対応するTLSバージョンと鍵交換用の情報などを送信。サーバーが応答します。
公開鍵・秘密鍵・共通鍵の役割も切り替えよう
サーバー証明書には認証用の公開鍵が含まれます。サーバーは対応する秘密鍵でハンドシェイクに署名し、PCは公開鍵で検証します。CAも証明書に電子署名しますが、それは別の署名です。
教育用の判定モデルです。実際のTLSプロトコル、暗号計算、証明書失効検査、OS/ブラウザの細かな振る舞いを再現するものではありません。TLS 1.3の代表的な証明書認証方式を想定しています。
全部の技術を一枚で整理する
電子署名
認証局(CA)
サーバー証明書
クライアント証明書
MAC / HMAC
TLSの共通鍵
ここだけは混同しない
誤解1:証明書があれば通信内容が暗号化される
誤解2:公開鍵は暗号化に使う鍵である
誤解3:CAの署名とサーバーの署名は同じ
誤解4:HTTPSならWebサイトも絶対安全
誤解5:クライアント証明書=社員の権限
まとめ:「相手確認」「合言葉づくり」「秘密の会話」を分ける
認証局は身分証の発行者、証明書は公開鍵つきの身分証、電子署名は秘密鍵の持ち主による証明、鍵交換は通信のための秘密づくり、共通鍵暗号は実際の会話の保護です。HTTPSはこれらを組み合わせる仕組みです。クライアント証明書を追加すると、サーバー側も接続元の鍵所有者を確認できます。
①「誰の公開鍵か」=証明書とCA
②「秘密鍵の持ち主か」=電子署名の検証
③「通信用の秘密を共有」=鍵交換
④「本文を安全に送る」=共通鍵による認証付き暗号