◆ SSL/TLSセッションのハンドシェイク
SSLクライアントとSSLサーバとでやりとりされるメッセージのなかで、以下のメッセージについては
やりとりを省略した通信が行われる場合もあります。
・ Server Certificate
・ Server Key Exchange
・ Certificate Request
・ Client Certificate
・ Certificate Verify
例えば、クライアント証明書を使用しないSSL通信であれば「Client CertificateとCertificate Verify」が省略。
◆ SSL/TLSのメッセージ
・ Client Hello
SSLの通信開始をクライアントからサーバに通知するメッセージ。メッセージに含まれている内容は以下です。
⇒ SSL/TLSのバージョン、乱数、セッションID、クライアントが利用できる暗号化方式と圧縮方法の一覧。
・ Server Hello
クライアントからのClient Helloの送信された一覧情報に基づいて、サーバは使用する暗号化とハッシュ関数の
アルゴリズムを決定してクライアントに通知します。Server Helloに含まれている内容は以下の通りです。
⇒ SSL/TLSのバージョン、乱数、セッションID、サーバ側で決定した暗号化方式と圧縮方法の一覧。
・ Server Certificate(省略される場合もある)
サーバからクライアントに向けて、SSLサーバ証明書を送信します。その証明書を発行した認証局の証明書や、
上位の認証局の証明書を含むなど、ルート証明書までの証明書リスト(証明書チェーン)を含んでいます。
・ Server Key Exchange(省略される場合もある)
SSLサーバ証明書を保持していないサーバである場合、またはServer Certificateで送信したSSLサーバ証明書
に公開鍵が含まれない場合に共通鍵を交換するための公開鍵を送信するメッセージです。
・ Certificate Request(省略される場合もある)
クライアント認証を行う場合、サーバがクライアントに対してクライアント認証用の証明書を送るように要求
するメッセージです。Certificate Requestには、サーバが信頼するルート証明書のリストを含んでいます。
・ Server Hello Done
クライアントに対して、Server Helloから始まる上述のメッセージが完了したことを通知します。
・ Client Certificate(省略される場合もある)
サーバからCertificate Requestメッセージを受信した場合にサーバに対してクライアント証明書を送信します。
この際にルート証明書までの証明書リスト(証明書チェーン)も送信します。
・ Client Key Exchange
クライアントとサーバだけが知り得る共通鍵を生成するために、プリマスタシークレットと呼ばれる乱数情報を
生成します。クライアントは、生成したプリマスタシークレットをサーバの公開鍵を使用して暗号化した上で、
サーバに送信します。
・ Certificate Verify(省略される場合もある)
Client Certificateメッセージを送信した場合、クライアント証明書に対する署名データとしてこのメッセージ
を送信します。サーバから、Certificate Requestがなかった場合にはClient Certificateとともに省略されます。
・ Change Cipher Spec
以上のメッセージのやりとりにより、クライアントとサーバだけがプリマスタシークレットを共有したことに
なります。乱数とプリマスタシークレットを使用して「マスターシークレット」を生成します。そして、この
マスターシークレットから共通鍵を生成します。以降は、この共通鍵を使用した暗号化通信を行うことを通知
するために、クライアントはサーバにChange Cipher Specメッセージを送信します。
・ Finished
クライアントがサーバ認証に成功して共通鍵を共有できたことをサーバに通知します。
・ Change Cipher Spec
サーバ側でも同様に、受信したプリマスタシークレットと乱数をもとにしてマスターシークレットを生成して
共通鍵を生成します。共通鍵を生成できるとクライアントにその旨をChange Cipher Specで通知します。
・ Finished
サーバがクライアント認証に成功して、共通鍵を共有できたことをクライアントに通知します。
|