見出し画像

こうして安全な通信は確立される!SSL/TLSハンドシェイク(後編)

はい、こんにちは!松井真也です。

シリーズ「毎日あなたが安全にウェブ利用できるスゴイ仕組み:SSL/TLS」の第7回でございます!

前回は、SSL/TLSによる接続開始から終了までのフローのうち、その前半部分をご紹介しました。Client Helloで、対応可能な暗号スイートを提示して、Server Helloで暗号方式を決定、Server Certificateでデジタル署名を検証しサーバの真正性を確認するのでした。

さて今回は、そのフローの後半です!主にやるべきことは「共通鍵の交換」です。公開鍵暗号方式をうまく利用して、共通鍵を交換するのでしたね。でも、具体的にどうやるのでしょうか?もう少し掘り下げてみましょう!

Client Key Exchange:鍵の「タネ」を送る

前半で暗号方式が決定し、サーバ証明も終わりましたので、今度はいよいよ暗号化に必要な共通鍵をクライアントがサーバに送ります。

ただし、「カギを送る」というと少し語弊があって、その「素」「タネ」になるものを送って、クライアントとサーバ各自でカギを作り出すのですよ!面白い仕組みですね。詳細はこうです。

  1. プリマスターシークレットの生成: キー交換の最初のステップとして、クライアントは「プリマスターシークレット」と呼ばれるランダムなデータを生成します。このデータが、セッション中の暗号化と整合性保護に不可欠なセッションキー(共通鍵)の生成に使われます。
    「プリ」がついているのがポイントで、後で「マスターシークレット」が生成されますよ。

  2. プリマスターシークレットの暗号化: クライアントは、サーバーから以前に受け取った公開鍵を使用してプリマスターシークレットを暗号化します。これにより、公開鍵に対応するプライベートキーを持つサーバーのみがこの情報を復号できるようになります。

  3. Client Key Exchangeメッセージの送信: 暗号化されたプリマスターシークレットは、Client Key Exchangeメッセージの一部としてサーバーに送信されます。

セッションキーの生成

サーバは、プリマスターシークレットを受け取りました。その後、個々がハイライトです。セッションキー(共通鍵)を作り出しますよ~。

  1. プリマスターシークレットの復号化: サーバーは自身のプライベートキーを使用して、受け取った暗号化されたプリマスターシークレットを復号します。
    取り出せるのは、このサーバだけですよ。プライベート鍵は誰とも共有してませんからね。これで、サーバーとクライアントは「同じプリマスターシークレット」を共有していることが保証されます。

  2. マスターシークレットの生成: クライアントとサーバーは共有されたプリマスターシークレットの他にも共通鍵生成に必要なものを持っています。それが、前の工程で交換したランダムなデータ「クライアントランダム」と「サーバーランダム」です。
    この3つを材料として、「マスターシークレット」を生成します。あれ、生成されるのは「共通鍵」じゃなかったの?と言いたくなりますが、もうワンステップ必要です。
    なお、「クライアントランダム」と「サーバーランダム」は盗聴できても、「プリマスターシークレット」は盗聴困難ですから、第三者は「マスターシークレット」を作り出せないわけですよ。

  3. セッションキーの導出:上記のマスターシークレットから、実際の通信に使用される「セッションキー」「MACキー」を導出します。この2つを作るのがミソですよ。

鍵交換が終わると、クライアントは「Change Cipher Spec」メッセージを送り、これをもってセッションの暗号化が始まったことをサーバーに通知します。サーバーも同様に「Change Cipher Spec」を送信し、双方が共通の鍵で通信を暗号化する準備が整います。この時点で、通信は外部からの盗聴や改ざんから保護されるようになります。

よかった、よかった。

「セッションキー×MACキー」を使った暗号化通信

最後にどのように暗号化通信が行われるか、簡単に見てみましょう!

  1. アプリケーションデータの準備
    送信するデータ(平文)が準備されます。

  2. MACの生成
    その送信データに対して「メッセージ認証コード(MAC)」が計算されます。これは、データの完全性を保証するためのもので、MACキーを使用してデータのハッシュ値を生成します。

  3. データとMACの結合
    次に、送信データとそのMAC値を結合します。

  4. 暗号化の実施
    データとMAC値が結合された後、その全体をセッションキーを使用して暗号化します。この鍵は、通信のセキュリティを保持するために使用される鍵で、これによりデータの機密性が保護されます。

  5. 送信
    暗号化されたデータ(アプリケーションデータとMAC値を含む)がネットワークを通じて送信されます。

  6. 受信と検証
    受信側では、まず暗号化されたデータをセッションキーで復号します。その後、MAC値を抽出し、復号されたアプリケーションデータに対して再度MACを計算し、送信されてきたMAC値と比較します。この一致を確認することで、データが途中で改ざんされていないことを確認します。

こうやって、SSL/TLSでは機密性と完全性を同時に担保します!

はい、本日は、ここまで!今回はSSL/TLSのハンドシェイクの後半をご紹介しました。共通鍵を交換するのではなく、その材料を交換していたのがミソでした。そして、作り出すのは、セッションキーとMACキーの2つであったところもポイントでした。

さて、次回はSSL/TLSのパケット構造を見ていきましょうか!

では!

この記事が気に入ったらサポートをしてみませんか?