SSL/TLSハンドシェイク
SSL/TLSでは暗号化通信を確立するために必要な情報を交換するためのSSL/TLSハンドシェイクと呼ばれるやり取りを行います。
SSL/TLSハンドシェイクのシーケンス

①Client Hello
クライアントがサーバに対して暗号化通信開始の通知します。
Client Helloメッセージに含まれている内容は以下です。
・SSL/TLSのバージョン
・セッションID
・現在時刻
・client random(共通鍵作成に使用)
・使用できる暗号化方式や圧縮方式の一覧
②Server Hello
Client Helloの情報に基づいてサーバが使用する暗号化方式や鍵の情報をクライアントに通知します。
Server Helloメッセージに含まれている内容は以下です。
・SSL/TLSのバージョン
・セッションID
・現在時刻
・server random(共通鍵作成に使用)
・サーバ側で決定した暗号化方式や圧縮方式の一覧
③Server Certificate
サーバからクライアントに対してサーバ証明書を送付します。
サーバ証明書だけではなく中間証明書やルート証明書などの証明書リスト(証明書チェーン)も送付します。
ルート証明書はクライアント側で確認できるため省略されることがあります。
また、認証を使用しない場合(ほとんどない)はこのメッセージ自体が省略されます。
④Server Key Exchange
サーバ証明書を送付していない場合(Server Certificateメッセージを送付していない場合)や送付したサーバ証明書に公開鍵が含まれていない場合に共通鍵の交換に必要な情報(公開鍵等)をクライアントに送信します。
(Server Certificateが省略されることはほとんどないのでServer Key Exchangeはほとんど省略されます)
⑤Certificate Request
クライアント認証をする場合にサーバがクライアントに対して証明用の証明書を送付するように要求するメッセージです。Certificate Requestにはサーバが信頼しているルート証明書の一覧が含まれています。
認証が不要な場合にはこのメッセージは省略されます。
⑥Server Hello Done
クライアントに対して、Server Helloから始まる一連のメッセージが完了したことを通知します。
⑦Client Certificate
サーバからCertificate Requestを受けた場合、クライアント認証用の証明書を送付します。
その際にクライアント証明書だけではなく中間証明書やルート証明書などの証明書リスト(証明書チェーン)も送付します。
⑧Client Key Exchange
クライアントはプリマスタシークレットと呼ばれる乱数情報を生成して、サーバの公開鍵で暗号化して送付します。
⑨Certificate Verify
Client Certificateメッセージを送信した場合、クライアントが送付した証明書が正しいことを証明するためのクライアントのディジタルを署名を送付します。クライアントが送付した証明書の公開鍵を使用してディジタル署名の検証を行います。
⑩Change Cipher Spec
これまでのメッセージでサーバとクライアントで共通のプリマスタシークレットの情報を共有できました。client random、server random、プリマスタシークレットを使用してマスターシークレットを生成します。そしてこのマスターシークレットから暗号化通信に用いるための共通鍵等(その他ブロック暗号用のIVやHMAC用の共通鍵)を生成します。
これで暗号化通信の準備が完了し、暗号化通信の開始を相手に通知するためのメッセージとしてChange Cipher Specメッセージを送信します。
⑪Finished
クライアントからハンドシェイクの終わりを宣言するメッセージを送信します。
このメッセージにはハンドシェイクで送受信したすべての通信のHMACを含めて送信します。
この値によりサーバはSSL/TLSハンドシェイク一連のデータを保持していることや共通のマスターシークレットを保持していることを確認できます。
⑫Change Cipher Spec
サーバ側でも同様にclient random、server random、プリマスタシークレットを使用してマスターシークレットを生成します。そしてこのマスターシークレットから暗号化通信に用いるための共通鍵等(その他ブロック暗号用のIVやHMAC用の共通鍵)を生成します。
暗号化通信の開始を相手に通知するためのメッセージとしてChange Cipher Specメッセージを送信します。
⑬Finished
サーバーからハンドシェイクの終わりを宣言するメッセージを送信します。
サーバー側も同様にこのメッセージにはハンドシェイクで送受信したすべての通信のHMACを含めて送信します。
この値によりサーバはSSL/TLSハンドシェイク一連のデータを保持していることや共通のマスターシークレットを保持していることを確認できます。