TLSを1から — 鍵交換と証明書の仕組み
HTTPSの鍵アイコンの裏側では、初対面の相手と、盗聴されている経路の上で秘密を作るという離れ業が起きています。鍵交換・証明書・ハンドシェイクを前提知識ゼロから積み上げ、なぜ中間者攻撃を防げるのかを一続きで追います。
盗聴されている道で、初対面の相手と秘密を作る
インターネットの通信は、封筒ではなく葉書に近いものです。あなたのパケットは自宅のルーター、カフェのWi-Fiアクセスポイント、契約しているISPの装置、海を渡る中継設備、そして相手のデータセンターの入口を順番に通ります。途中の誰かがその内容を読んでも、書き換えても、素の通信には気づく手立てがありません。
TLS(Transport Layer Security)は、この葉書の上に安全な会話を成立させる仕組みです。HTTPSの「S」の正体であり、ブラウザの鍵アイコンが指しているものでもあります。
TLSが約束しているのは、次の3つです。
- 機密性: 経路上の第三者に中身が読めない
- 完全性: 1ビットでも改ざんされたら受信側が検知できる
- 同一性: 話している相手が、本当に
example.comの持ち主である
難所は3つ目です。前の2つは暗号の道具箱でほぼ解けます(共通鍵・公開鍵・ハッシュという道具立ては暗号を1からで扱いました)。しかし「相手が本人か」は、暗号の計算だけでは決まりません。ここが後半の主題になります。
秘密を「送らずに」共有する
まず機密性から始めます。中身を暗号化するには、送信側と受信側が同じ鍵を持っている必要があります。ところが鍵そのものを経路に流せば、盗聴者にも同じ鍵が渡ってしまう。これが最初の矛盾です。
絵の具で考えると抜け道が見えます。あなたと相手は、まず誰に見られてもいい共通の色を決めます。次に各自が自分だけの色を用意し、共通色に混ぜたものを交換します。受け取った混色に、自分だけの色をもう一度混ぜる。すると二人の手元には、同じ色(共通色+あなたの色+相手の色)が現れます。盗聴者が見たのは共通色と2つの混色だけで、そこから元の色を分離することはできません。混ぜるのは簡単、分離は難しいという非対称性が効いています。
これを数で実装したのが Diffie-Hellman 鍵交換です。公開の大きな素数 と底 を決め、各自が秘密の数 、 を選びます。
つまり「自分だけの数だけ底を掛け合わせ、 で割った余りを送る」という操作です。 は割った余りを取ることで、これがあるおかげで結果から元の数を逆算しにくくなります。
つまり「相手からもらった値に、自分の秘密の数をもう一度作用させると、二人とも同じ にたどり着く」ということです。この が共有秘密になります。経路に流れたのは 、、、 だけで、 も も も一度も送られていません。
盗聴者が から を求める問題は離散対数問題と呼ばれ、鍵の大きさを増やすと必要な計算量が現実的でない桁まで跳ね上がります。「解けない」のではなく「解くのに割の合わない時間がかかる」——暗号の安全性はいつもこの形をしています。
共通鍵にすぐ切り替える理由
鍵交換で秘密が共有できたなら、以降はその秘密から作った共通鍵で本文を暗号化します。公開鍵の演算はけた違いに重く、動画やAPIレスポンスを丸ごと通すには向かないからです。
そこでTLSは役割を分けます。握手(ハンドシェイク)の間だけ公開鍵の道具を使い、本文は共通鍵暗号で運ぶ。このハイブリッド構成が、TLSの骨格です。
e が付いている理由 — 前方秘匿性
現代のTLSで使われる鍵交換は ECDHE、つまり楕円曲線版のDiffie-Hellmanです。末尾の E は ephemeral(一時的)を意味し、接続のたびに と を作り直して、握手が終わったら捨てることを表します。
これが効くのは将来の話です。かつてのTLSには、クライアントが共通鍵を作ってサーバーの公開鍵で暗号化して送る方式(RSA鍵交換)がありました。この方式では、サーバーの秘密鍵が数年後に漏れた場合、攻撃者が保存しておいた過去の通信をまとめて復号できてしまいます。鍵が1本しかないからです。
一時鍵なら、漏れて困る鍵はもう存在しません。この性質を前方秘匿性(forward secrecy)と呼びます。TLS 1.3(RFC 8446)は静的RSA鍵交換を仕様から削除し、鍵交換を (EC)DHE に限定しました。使ってはいけない選択肢を残さない、という設計判断です。
鍵交換だけでは中間者に負ける
ここで重大な穴があります。Diffie-Hellman が保証するのは「誰かと秘密を共有できた」ことだけで、「誰と共有したか」は何も言っていません。
攻撃者がカフェのWi-Fiで経路の真ん中に座り、こう振る舞ったとします。クライアントに対してはサーバーのふりをして鍵交換を1本、サーバーに対してはクライアントのふりをして鍵交換をもう1本。攻撃者は2つの共有秘密を持ち、受け取った通信を復号し、読み、書き換え、もう一方の鍵で暗号化し直して転送します。両端から見れば通信は完璧に暗号化されていて、異常は何も起きません。これが中間者攻撃(MITM)です。
コメント
コメントにはログインが必要です