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