SSL/TLSに関わる技術について、前回までの記事で紹介してきました。安全な通信を行うためにたくさんの技術が使われていることが垣間見えたのではないでしょうか。
ただ、たくさんの技術が組み合わさっているため、どこでどのような目的で使われているのか混乱してしまうところもあったと思います。

今回は、SSL/TLS通信の仕組みと流れについて今一度復習していきます。

SSL/TLS通信の流れは大きく分けると、2つのフェーズでてきています。前半がSSLハンドシェイク、後半がデータ転送になります。以下、1~4がSSLハンドシェイク、5がデータ転送フェーズということになります。その点も踏まえて振り返っていきましょう。

1.サポートしている暗号スイートの提示

クライアントはまず、自身がサポートしているSSLバージョンや暗号スイートをサーバー側に提示します。そしてお互いにサポートしているバージョンや暗号スイートを確かめ、サーバーは、今回のSSL/TLS通信で使用するものを決定し、クライアントに「これにしましょう」と返します。

2. サーバー証明書と公開鍵を送る

次に、サーバーはサーバー証明書をクライアントに送ります。自身のサーバー証明書をクライアントに送ることで「自分が本物である」ということを示します。
また、サーバー証明書には公開鍵が含まれています。(公開鍵は、サーバー側にある秘密鍵でしか復号できないため、暗号化する前に送っても問題ありません。)

3.サーバー証明書の確認と共通鍵の生成

クライアントは本当に本物のサーバーと通信しているのかをサーバー側から提示されるサーバー証明書を使って確認します。サーバー証明書の階層をたどっていき、クライアント(Webブラウザ等)自身に登録されているルート証明書と照合します。(仮に、信頼する証明書にたどり着かなった場合、認証は失敗します。)
照合した結果、安全であることが確認できたら、クライアントは共通鍵を生成します。

4.共通鍵を公開鍵で暗号化して送る

生成した共通鍵を公開鍵で暗号化してサーバーに送信します。
サーバー側は、送られてきたを暗号化ファイルを秘密鍵で復号し、共通鍵を取り出します。これで、クライアントとサーバーの両方で安全に共通鍵を持つことができました。

5. SSL/TLS通信を開始

あとは、クライアント、サーバーともに共通鍵を使って暗号化通信をしていきます。その際にやり取りされるデータにはメッセージ認証コード(MAC)を付与して、通信途中で改ざんされていないかもチェックします。