SSL/TLSが提供する機能として、暗号化・改ざん検知・認証の3つがあります。
SSL/TLSではこれらの機能を実現するために、SSL通信の開始(ハンドシェイク)時に様々な技術を組みあせ合わせています。
SSLハンドシェイク
通信を開始する際、SSL/TLSはTCPを利用するため、まずTCPの3ウェイハンドシェイク(SYN→SYN/ACK→ACK)を行い、TCPセッションを確立します。その後、SSLハンドシェイクを行い、そこで決めた情報をもとにメッセージを暗号化します。SSLハンドシェイクは「暗号スイートの提示」「通信相手の証明」「共通鍵の交換」「最終確認」という4ステップで構成されます。
SSLハンドシェイクの流れを見ていくことで、SSL/TLSの全体の概要をつかむことができるため、まずはSSLハンドシェイクで何が行われているのか、そのさわりを確認していきましょう。
SSLハンドシェイクの概要をよくあるパターンで示します。下図では左側にSSLクライアント、右側にSSLサーバーを置き、両者でやり取りする内容を記載しています。
上図が概要ですが、SSLハンドシェイクでやり取りされている内容を何となくでもイメージをつかめたでしょうか。以降に上図の簡単な説明を記載します。それぞれの詳細については別記事で取り上げます。ここでは全体の流れを確認しましょう。
サポートしている暗号スイートの提示
クライアントはまず、自身がサポートしているSSLバージョンや暗号スイートをサーバー側に提示します。暗号スイートとは、鍵交換の方法、サーバー認証の方法、暗号化の方法、MACアルゴリズムをまとめ呼び方です。「暗号化する」「ハッシュ化する」といっても世の中には様々なアルゴリズムが存在しており、それら全てをサポートしているわけではありません。自分はこのアルゴリズムなら使えますとサーバー側に提示しているわけです。
通信相手の証明
次に、クライアントは本当に本物のサーバーと通信しているのかをサーバー側から提示されるサーバー証明書を使って確認します。サーバーは自身のサーバー証明書をクライアントに送ることで「自分が本物である」ということを示します。クライアントは受け取ったサーバー証明書を検証(ルート証明書で復号→MD比較)し、本物のサーバーであることを確認します。
共通鍵の交換
メッセージの暗号化に使用する共通鍵を交換します。といっても共通鍵そのものを交換するわけではなく、ここではあくまで共通鍵の素材(プレマスターシークレット)を交換します。(実際に使用する共通鍵はここで交換するプレマスターシークレットとClient Helloで得た「client random」、Server Helloで得た「server random」を混ぜて作り出します。)
共通鍵は当然、誰かに知られるわけにはいきません。そのため、プレマスターシークレットを公開鍵で暗号化して、送ります。受け取ったサーバーは、秘密鍵で復号してプレマスターシークレットを取り出し、clinet randomやserver randomと合わせて共通鍵を生成します。
最終確認
最後の確認作業です。SSL/TLSによる暗号化通信を行うための暗号化方式(AES、DES、3DESなど)を宣言し、ハンドシェイクの終了を互いに確認し合います。
これで、SSLハンドシェイクは終了です。以降は、SSLハンドシェイクの中で生成した共通鍵を使用して暗号/復号を行い、安全なデータ通信を行うことになります。
⇒次のカテゴリー「SSL/TLSに関わる技術」