TLSハンドシェイクとは?
TLSは、インターネット通信を安全にするために設計された暗号化および認証プロトコルです。TLSハンドシェイクは、TLSを使った通信セッションを始めるプロセスです。TLSハンドシェイクの間、通信する二者がメッセージをやり取りして互いを認識し、検証し、使用する暗号アルゴリズムを決定し、セッション鍵について合意します。TLSハンドシェイクはHTTPSの仕組みの根本部分です。
TLSハンドシェイクとSSLハンドシェイク
SSL(Secure Sockets Layer)は、HTTPのために開発された本来のセキュリティプロトコルです。SSLは少し前にTLS(Transport Layer Security)にとって代わられ、SSLハンドシェイクは現在ではTLSハンドシェイクと呼ばれています(「SSL」という名称も依然広く使用されていますが)。
ガイド
アプリケーションへのアクセスを保護するためのZero Trustガイド
TLSハンドシェイクはいつ発生するのか?
TLSハンドシェイクは、ユーザーがHTTPSでWebサイトに来て、ブラウザーがそのサイトのオリジンサーバー(配信元サーバー)に問い合わせ始めた時に行われます。TLSハンドシェイクは、その他の何らかの通信でHTTPSが使われる時(API呼び出し、DNS over HTTPSクエリなど)にも起こります。
TLSハンドシェイクは、TCPハンドシェイクを介してTCP接続が開かれた後に行われます。
セキュアなSSL
すべてのCloudflareプランに含まれる無料SSL
TLSハンドシェイクのプロセスは?
TLSハンドシェイクの過程では、クライアントとサーバーが協力して以下を行います。
- 使用するTLSのバージョン(TLS 1.0、1.2、1.3など)を指定します。
- 使用する暗号スイート(下記参照)を決定します。
- サーバーのパブリック鍵(公開鍵)とSSL証明書認証局のデジタル署名を介して、サーバーのIDを認証します。
- ハンドシェイクの完了後に対称暗号化を使うためのセッション鍵を生成します。
TLSハンドシェイクの手順は?
TLSハンドシェイクは、クライアントとサーバーによって交換される一連のデータグラムまたはメッセージです。クライアントとサーバーがハンドシェイクを完了し、その後のやりとりができるよう必要な情報を交換するために、TLSハンドシェイクは複数のステップを経て行われます。
TLSハンドシェイク内の具体的な手順は、使用される鍵交換アルゴリズムの種類と、両側でサポートされる暗号スイートによって異なります。RSA鍵交換アルゴリズムは、現在では安全ではないと考えられていますが、1.3以前のTLSのバージョンで使用されていました。おおよそ次のような流れになります。
- 「Client Hello」メッセージ:クライアントがサーバーに「Hello」というメッセージを送信することによってハンドシェイクを開始します。このメッセージには、クライアントがサポートするTLSのバージョン、対応する暗号スイート、「クライアントランダム」というランダムなバイト文字列が含まれています。
- 「Server Hello」メッセージ:Client Helloメッセージへの返答として、サーバーがメッセージを送ります。このメッセージには、サーバーのSSL証明書、選んだ暗号スイート、サーバーが生成した別のバイト文字列「サーバーランダム」が含まれています。
- 認証:クライアントはサーバーのSSL証明書を発行元の認証局に確認します。これにより、サーバーが自称する本人に間違いなく、クライアントはそのドメインの実際の所有者とやりとりしていることが確認されます。
- プレマスタシークレット:クライアントは、「プレマスタシークレット」と呼ばれるもう1つのランダムなバイト文字列を送信します。プレマスタシークレットはパブリック鍵で暗号化されており、復号化は秘密鍵を使うサーバーしか行えません。(クライアントはサーバーのSSL証明書からパブリック鍵(公開鍵)を入手します。)
- 使用される秘密鍵:サーバーはプレマスタシークレットを解読します。
- セッション鍵の生成:クライアントとサーバーは共にクライアントランダムとサーバーランダム、プレマスターシークレットからセッション鍵を生成します。双方とも同じ結果になるはずです。
- クライアントの準備完了:クライアントは、セッション鍵で暗号化された「finished(完了)」のメッセージを送信します。
- サーバーの準備完了:サーバーは、セッション鍵で暗号化された「finished(完了)」のメッセージを送信します。
- セキュアな対称暗号化の実現:ハンドシェイクが完了し、セッション鍵を使用して通信が続行されます。
すべてのTLSハンドシェイクは、非対称暗号(公開鍵と秘密鍵)を使用しますが、すべてのセッション鍵の生成プロセスで必ず秘密鍵を使用するというわけではありません。たとえば、一時的なDiffie-Hellmanハンドシェイクは次のように進行します。
- Client Hello:クライアントは、プロトコルのバージョン、クライアントランダム、暗号スイートのリストを含む「Client Hello」メッセージを送信します。
- Server Hello:サーバーはSSL証明書、選んだ暗号化スイート、サーバーランダムを返信します。上述のRSAハンドシェイクとは違い、サーバーはこのメッセージに次の内容(ステップ3)も含めます。
- サーバーのデジタル署名:サーバーは、ここまでのすべてのメッセージのデジタル署名を計算します。
- デジタル署名確認完了:クライアントはサーバーのデジタル署名を検証し、サーバーが自称する本人に間違いないことを確認します。
- クライアントDHパラメーター:クライアントは、サーバーにDHパラメーターを送信します。
- クライアントとサーバーがプレマスタシークレットを計算:クライアントがプレマスタシークレットを生成してサーバーに送信する代わりに、RSAハンドシェイクのように、クライアントとサーバーが交換したDHパラメーターを使用してマッチするプレマスタシークレットを個別に計算します。
- セッション鍵の作成:次に、クライアントとサーバーが、RSAハンドシェイクの時と同様に、プレマスタシークレット、クライアントランダム、サーバーランダムからセッション鍵を計算します。
- クライアントの準備完了:RSAハンドシェイクと同様
- サーバーの準備完了
- セキュアな対称暗号化を実現
*DHパラメーター:DHはDiffie-Hellmanの略です。Diffie-Hellmanアルゴリズムは、指数計算によって同じプレマスターシークレットに到達します。サーバーとクライアントはそれぞれ計算用のパラメーターを提供し、それらを組み合わせてそれぞれの側で異なる計算を行いますが、結果は等しくなります。
一時的Diffie-Hellmanハンドシェイクと他種のハンドシェイクの比較と、それらがどのように前方秘匿性を実現するかについて、詳しくはWhat is Keyless SSL?をご参照ください。
TLS 1.3のハンドシェイクは何が違うのか?
TLS 1.3はRSAをはじめ、攻撃されやすい暗号スイートやパラメータをサポートしません。また、TLSハンドシェイクを短縮し、TLS 1.3のハンドシェイクをより高速かつ安全にします。
TLS 1.3のハンドシェイクの基本的な手順は以下の通りです。
- Client Hello:クライアントは、プロトコルのバージョン、クライアントランダム、暗号スイートのリストを含むClient Helloメッセージを送信します。TLS 1.3から安全でない暗号スイートのサポートが削除されたため、可能な暗号スイートの数は大幅に減少しています。また、Client Helloには、プリマスターシークレットの計算に使用されるパラメータが含まれています。基本的に、クライアントはサーバーが好む鍵の交換方法を知っていると想定しています(暗号スイートのリストが簡略化されているため、おそらく知っていると思われます)。これは、TLS 1.3のハンドシェイクとTLS 1.0、1.1、1.2のハンドシェイクの重要な違いの1つである、ハンドシェイク全体の長さを短縮するものです。
- サーバーのマスターシークレット生成:この時点で、サーバーはクライアントランダムおよびクライアントのパラメータと暗号スイートを受け取っています。サーバーランダムは自分で生成できるため、すでに持っています。したがって、サーバーはマスターシークレットを作成することができます。
- Server Helloと「完了」:Server Helloには、サーバーの証明書、デジタル署名、サーバーランダム、選択した暗号スイートが含まれます。すでにマスターシークレットを持っているため、「完了」メッセージも送信します。
- 最終ステップとクライアントの「完了」:クライアントが署名と証明書を検証し、マスターシークレットを生成し、「完了」メッセージを送信します。
- セキュアな対称暗号化を実現
セッション再開のための0-RTTモード
TLS 1.3では、さらに高速なTLSハンドシェイクをサポートしており、クライアントとサーバー間のラウンドトリップ(往復の通信)を全く必要としない。クライアントとサーバーが以前に接続したことがある場合(たとえば、ユーザーが以前にWebサイトを訪れたことがある場合)、それぞれ最初のセッションから「resumption main secret(再開メインシークレット)」と呼ばれる別の共有の秘密を導き出すことができます。また、サーバーはこの最初のセッションの間に、セッションチケットと呼ばれるものをクライアントに送ります。クライアントはこの共有の秘密を使って、次のセッションの最初のメッセージで、そのセッションチケットとともに暗号化されたデータをサーバーに送信することができます。そして、クライアントとサーバーの間でTLSが再開されます。
暗号スイートとは?
暗号スイートは、安全な通信接続を確立するために使用するアルゴリズムのセットです。広く使われる暗号スイートは数多くあります。TLSハンドシェイクの重要な部分は、どの暗号スイートをハンドシェイクに使用するかについての合意です。
TLS/SSLの詳細は、SSLの仕組みをご覧ください。