TLS ハンドシェイク プロトコル
トランスポート層セキュリティ (TLS) ハンドシェイク プロトコルは、セキュリティで保護されたセッションを確立または再開するために必要な認証とキー交換を担当します。 セキュリティで保護された セッションを確立する場合、ハンドシェイク プロトコルは次を管理します。
- 暗号スイートネゴシエーション
- サーバーの認証と必要に応じて、クライアント
- セッション キー情報の交換。
暗号スイートネゴシエーション
クライアントとサーバーが連絡を取り、メッセージ交換全体で使用される暗号スイートを選択します。
認証
TLS では、サーバーはクライアントにその ID を証明します。 クライアントは、その ID をサーバーに証明する必要がある場合もあります。 PKI は、 公開キーと秘密キーのペアを使用する認証の基礎です。 認証に使用される正確な方法は、ネゴシエートされた暗号スイートによって決定されます。
キー交換
クライアントとサーバーは、乱数と、マスター前シークレットと呼ばれる特殊な番号を交換します。 これらの数値は、クライアントとサーバーが共有シークレット (マスター シークレットと呼ばれる) を作成することを許可する追加のデータと組み合わされます。 マスター シークレットは、クライアントとサーバーによって、 ハッシュに使用されるセッション キーである書き込み MAC シークレットと、暗号化に使用される セッション キー である書き込みキーを生成するために使用されます。
TLS を使用したセキュリティで保護されたセッションの確立
TLS ハンドシェイク プロトコルには、次の手順が含まれます。
- クライアントは、クライアントのランダムな値とサポートされている暗号スイートと共に、"Client hello" メッセージをサーバーに送信します。
- サーバーは、サーバーのランダムな値と共に"Server hello" メッセージをクライアントに送信することで応答します。
- サーバーは認証のために証明書をクライアントに送信し、クライアントに証明書を要求できます。 サーバーから "Server hello done" というメッセージが送信されます。
- サーバーがクライアントに証明書を要求した場合、クライアントは証明書を送信します。
- クライアントは、ランダムなマスター前シークレットを作成し、それをサーバーの証明書の 公開キー で暗号化し、暗号化されたマスター前シークレットをサーバーに送信します。
- サーバーはマスター前シークレットを受け取ります。 サーバーとクライアントはそれぞれ、マスター シークレットに基づいてマスター シークレットと セッション キー を生成します。
- クライアントは、メッセージのハッシュと暗号化に新しい セッション キー の使用を開始することを示すために、サーバーに "暗号仕様の変更" 通知 を 送信します。 クライアントは、"クライアントが完了しました" というメッセージも送信します。
- サーバーは "暗号仕様の変更" を受け取り、セッション キーを使用してそのレコード層のセキュリティ状態を対称暗号化に切り替えます。 サーバーは、"サーバーが完了しました" というメッセージをクライアントに送信します。
- クライアントとサーバーは、確立したセキュリティで保護されたチャネルを介してアプリケーション データを交換できるようになりました。 クライアントからサーバー、およびサーバーからクライアントに送信されるすべてのメッセージは、セッション キーを使用して暗号化されます。
TLS を使用したセキュリティで保護されたセッションの再開
クライアントは、再開するセッションのセッション ID を使用して "Client hello" メッセージを送信します。
サーバーは、セッション キャッシュで一致するセッション ID を確認します。 一致するものが見つかり、サーバーがセッションを再開できる場合は、セッション ID を含む "Server hello" メッセージが送信されます。
Note
セッション ID の一致が見つからない場合、サーバーは新しいセッション ID を生成し、TLS クライアントとサーバーはフル ハンドシェイクを実行します。
クライアントとサーバーは、"暗号仕様の変更" メッセージを交換し、"Client finished" メッセージと "Server finished" メッセージを送信する必要があります。
クライアントとサーバーは、セキュリティで保護されたチャネルを介したアプリケーション データ交換を再開できるようになりました。