はじめに
Webブラウザとサーバー間でデータをやり取りするためのプロトコルであるHTTPは、そのままでは通信内容が暗号化されておらず、盗聴などのリスクがあります。そこで、通信の安全性を確保するために欠かせないのが「TLS」や「SSL」の仕組みを用いたHTTPS通信です。本記事では、暗号化通信が確立されるまでの流れや、使われる鍵の仕組みについて学んだことをアウトプットしていきます。
内容
1. HTTPとHTTPS、およびSSLとTLSの違い
HTTPに「TLS」による暗号化を加えたものがHTTPSです。「S」はSecure(安全)を意味し、暗号化により通信内容の盗聴を防ぎます。
Webサイトの暗号化はよく「SSL化」と呼ばれますが、SSL(バージョン2.0や3.0)は脆弱性があり、現在はすべて廃止・使用禁止となっています。そのため、現在「SSL証明書」という言葉が頻繁に使われていますが、実際の通信では後継規格であるTLS(TLS 1.2または最も推奨されるTLS 1.3)が動いています。
2. 通信前の「準備の握手」:TLSハンドシェイク
HTTPSで実際のデータを送る前に、クライアントとサーバー間で「どのように暗号化するか」を安全に取り決める手順を「TLSハンドシェイク」と呼びます。
具体的な流れは以下の6つのステップで行われます。
- あいさつ:クライアント(Webブラウザ)とサーバーがやり取りし、使用する暗号方式を決定します。
- 証明書の交換:サーバーがSSL証明書を送り、クライアントが本物であるかを検証します。
- 公開鍵の取得:証明書の中からサーバーの公開鍵を取り出します。
- プリマスターシークレット送信:クライアントが乱数を生成し、手順3で取得した公開鍵で暗号化してサーバーへ送ります。
- セッション鍵の生成:クライアントとサーバーの両者が、乱数を元に同じ「セッション鍵(共通鍵)」を計算します。
- Finished交換:サーバーは、セッション鍵で暗号化された「finished(完了)」のメッセージを送信することで、TLSの準備は完了です。
3. 3つの鍵の役割(公開鍵・秘密鍵・セッション鍵)
TLSでは、安全性と通信速度の両方を確保するために、役割の異なる鍵を組み合わせて使います。
- 公開鍵:誰でも使用でき、プリマスターシークレットの暗号化に使われますが、処理が重いのが特徴です。
- 秘密鍵:サーバーだけが持っている鍵で、公開鍵で暗号化されたデータを復号(元のデータに戻す)できます。
- セッション鍵:ハンドシェイクの過程で生成される共通鍵です。処理が高速なため、実際のHTTPS通信(Webページデータの暗号化・復号)にはこのセッション鍵が使われます。
重要なポイントとして、処理の重い「公開鍵・秘密鍵」のペアが使われるのはハンドシェイク中の最初の1回だけであり、実際のデータ通信はすべて高速な「セッション鍵」で行われます。
結論
HTTPS通信は、最初に行われる「TLSハンドシェイク」によって安全に暗号化の準備を整えています。処理は重いが安全に鍵を受け渡しできる「公開鍵・秘密鍵」を最初に使い、その後の実際の通信は高速な「セッション鍵」に切り替えることで、セキュリティと通信速度を両立させているのが特徴です。