共通鍵を使った暗号通信を始めるまでにやりとりするさまざまなメッセージにSSLのポイントがある。Lesson3では,その肝となる部分のやりとりを詳しく見てみよう。

 SSLは,大きく二つの仕様で成り立っている。一つはメッセージのフォーマットで,もう一つはそのメッセージを使って暗号通信を実現するまでの手順である。メッセージのフォーマットは「レコード・プロトコル」と呼ばれており,やりとりの手順は「ハンドシェーク・プロトコル」と呼ばれている。

二つの仕様で構成する

 SSLで運ぶメッセージは「レコード」と呼ばれる(図3-1の上)。SSLのレコードは,大きくヘッダー部分とデータ部分に分かれている。このうちヘッダー部分には,データの種類(タイプ),バージョン(SSLかTLSか),データ長の情報が入っている。もう一方のデータ部分には,次で説明するハンドシェーク・プロトコルのメッセージや,暗号通信時の暗号化データが入る

図3-1●SSLのメッセージ構成とやりとりの内容
図3-1●SSLのメッセージ構成とやりとりの内容
メッセージの構成は「レコード・プロトコル」として,やりとりの手順は「ハンドシェーク・プロトコル」として規定されている。
[画像のクリックで拡大表示]

 暗号通信をするにあたって必要な情報をやりとりする際に使われるのがハンドシェーク・プロトコルである。個々のメッセージは,「ClientHello」や「ServerHello」といった種類(タイプ)が決まっており,クライアントとサーバーの両者が,メッセージの種類を区別できるようになっている。

典型的なやりとりを見てみよう

 それでは,一般的なSSLのやりとりの様子を見てみよう。

 SSLのやりとりは,クライアントがサーバーに,暗号通信で使う暗号方式などを提案することから始まる(図3-1の(1))。するとサーバーは,提案のあった方式から適切なものを一つ選んで返答する(同(2))。ここまでで,暗号通信時に使う暗号方式を決める。

 次にサーバーは,クライアントにCertificateメッセージを使ってサーバー証明書を送る(同(3))。証明書の情報を送り終えたら,そのことを知らせる(同(4))。

 クライアントは,(3)で入手したサーバー証明書からサーバーの公開鍵を取り出し,この公開鍵を使って暗号通信に使う共通鍵の基になる秘密の値(プレマスタ・シークレット)を暗号化して送信する。これがClientKeyExchangeメッセージである(同(5))。このように,実際のSSL通信では,共通鍵を直接やりとりするのではなく,共通鍵の基となるプレマスタ・シークレットをやりとりして,そこからクライアントとサーバーがお互いに共通鍵を生成するしくみになっている。こうすることで,共通鍵が漏えいする可能性を少しでも低くしているわけだ。

 サーバーは,この暗号化したデータを自身の秘密鍵で復号すると,プレマスタ・シークレットが出てくる。この時点で両者は,共通鍵の基となるプレマスタ・シークレットを共有できた。

 Lesson2で見た証明書のやりとりが3番目のCertificateメッセージによって,共通鍵のやりとりが5番目のClientKeyExchangeメッセージによって実現されている。

 この先クライアントは,これまで決めた暗号方式の採用を宣言し(同(6)),ハンドシェークの終了をサーバーに知らせる(同(7))。これを受けたサーバーの動作もクライアントと同様だ。暗号方式の採用を宣言し(同(8)),ハンドシェークの終了をクライアントに知らせる(同(9))。以上でハンドシェークは終了である。

 これ以降クライアントとサーバーは,共有したプレマスタ・シークレットから共通鍵を生成し,その共通鍵を使って暗号通信を実施する。