最終更新:

【仕組み解説】HTTPSはどうやって通信を暗号化しているのか — TLS/SSLの裏側を図解


TLSハンドシェイクの流れ クライアント サーバー ① ClientHello(暗号方式一覧) ② ServerHello + 証明書 + 公開鍵 ③ 証明書検証 → 共通鍵を公開鍵で暗号化 ④ 共通鍵が共有完了 → 暗号化通信スタート 🔑 公開鍵暗号で安全に鍵交換 🔒 共通鍵暗号で高速に通信 TLS 1.3 ではこの流れが1往復に短縮され、より高速・安全に
TLSハンドシェイクのイメージ
ひよこ ひよこ
ブラウザアドレスバーに鍵マークが出るけど、あれって何を意味してるの?
ペンギン先生 ペンギン先生
あの鍵マークは「この通信はHTTPSで暗号化されてるよ」というサインだよ。HTTPだと通信内容がそのまま流れるから、途中で誰かに覗き見される可能性がある。HTTPSはその通信を暗号化して、第三者に中身を読まれないようにしてるんだ。
ひよこ ひよこ
HTTPに「S」がついただけで、そんなに変わるの?
ペンギン先生 ペンギン先生
「S」はSecureのSだよ。具体的には、HTTPの下にTLS(Transport Layer Security)という暗号化の層を挟んでいるんだ。昔はSSLと呼ばれていたけど、今はTLSが正式名称。このTLSのおかげで、パスワードやクレジットカード番号を送っても途中で盗み読まれない仕組みになっているよ。
ひよこ ひよこ
TLSってどうやって暗号化を始めるの?いきなり暗号で話し始めるわけじゃないよね?
ペンギン先生 ペンギン先生
いい質問だね。暗号通信を始める前に「TLSハンドシェイク」という準備のやり取りがあるんだ。まずクライアント(ブラウザ)が「ClientHello」を送って、対応する暗号方式の一覧を伝える。サーバーが「ServerHello」で使う暗号方式を決めて返す。次にサーバーが証明書を送って「自分は本物だよ」と証明する。最後に鍵交換をして、共通の暗号鍵を作る。この一連の流れが終わると、やっと暗号化通信がスタートするよ。
ひよこ ひよこ
公開鍵暗号共通鍵暗号っていう言葉を聞いたことがあるけど、両方使うの?
ペンギン先生 ペンギン先生
そう、HTTPSは両方を組み合わせて使っているよ。公開鍵暗号は「鍵を安全に渡す」ために使って、実際のデータの暗号化には共通鍵暗号を使うんだ。公開鍵暗号は安全だけど処理が重い、共通鍵暗号は高速だけど鍵を相手に安全に渡すのが難しい。だから最初の鍵交換だけ公開鍵暗号を使って、共通鍵を安全に共有してから、あとは高速な共通鍵暗号で通信する。お互いの長所を活かしたハイブリッド方式だね。
ひよこ ひよこ
サーバーの証明書って、誰が「本物」って保証してくれるの?
ペンギン先生 ペンギン先生
それが「認証局」の役割だよ。サーバー証明書にはCAの電子署名が入っていて、ブラウザはその署名を検証するんだ。実は証明書はチェーン(連鎖)になっていて、サーバー証明書→中間CA→ルートCAとたどっていく。ルートCAの証明書はブラウザやOSにあらかじめ組み込まれているから、そこまでたどれれば「信頼できる」と判断される仕組みだよ。
ひよこ ひよこ
証明書を取るのってお金がかかるんじゃなかったっけ?
ペンギン先生 ペンギン先生
昔は有料が当たり前だったけど、2015年にLet's Encryptという無料のCAが登場して状況が変わったよ。自動で証明書を発行・更新できるから、個人のブログでも簡単にHTTPS化できるようになった。これが「常時HTTPS化」を一気に後押ししたんだ。今ではWebサイトの9割以上がHTTPSを使っているよ。
ひよこ ひよこ
TLSにもバージョンがあるって聞いたけど、最新版は何が違うの?
ペンギン先生 ペンギン先生
最新のTLS 1.3は2018年に策定されたバージョンだよ。大きな改善点は2つ。まずハンドシェイクが高速化されて、TLS 1.2では2往復必要だったのが1往復で済むようになった。これだけでページの表示が体感できるレベルで速くなる。もう1つは安全性の向上で、古くて弱い暗号方式がばっさり削除されたんだ。設定ミスで危険な暗号を使ってしまうリスクがなくなったよ。
ひよこ ひよこ
じゃあHTTPSなら絶対安全ってこと?
ペンギン先生 ペンギン先生
「通信経路の安全」は確保されるけど、「通信相手が善良かどうか」は別問題だよ。フィッシングサイトでもHTTPS対応しているものはたくさんある。鍵マークは「通信が暗号化されている」ことを意味するだけで、「サイトが安全」という意味ではないんだ。だから鍵マークだけで安心せず、URLドメインをちゃんと確認する習慣が大事だね。