![見出し画像](https://assets.st-note.com/production/uploads/images/138849739/rectangle_large_type_2_6ed7292a1c06a6c4f15f1b911b52d0ae.png?width=1200)
こうして安全な通信は確立される!SSL/TLSハンドシェイク(後編)
はい、こんにちは!松井真也です。
シリーズ「毎日あなたが安全にウェブ利用できるスゴイ仕組み:SSL/TLS」の第7回でございます!
前回は、SSL/TLSによる接続開始から終了までのフローのうち、その前半部分をご紹介しました。Client Helloで、対応可能な暗号スイートを提示して、Server Helloで暗号方式を決定、Server Certificateでデジタル署名を検証しサーバの真正性を確認するのでした。
さて今回は、そのフローの後半です!主にやるべきことは「共通鍵の交換」です。公開鍵暗号方式をうまく利用して、共通鍵を交換するのでしたね。でも、具体的にどうやるのでしょうか?もう少し掘り下げてみましょう!
![](https://assets.st-note.com/img/1714349073527-0N6OAGn5ii.png)
Client Key Exchange:鍵の「タネ」を送る
前半で暗号方式が決定し、サーバ証明も終わりましたので、今度はいよいよ暗号化に必要な共通鍵をクライアントがサーバに送ります。
ただし、「カギを送る」というと少し語弊があって、その「素」「タネ」になるものを送って、クライアントとサーバ各自でカギを作り出すのですよ!面白い仕組みですね。詳細はこうです。
プリマスターシークレットの生成: キー交換の最初のステップとして、クライアントは「プリマスターシークレット」と呼ばれるランダムなデータを生成します。このデータが、セッション中の暗号化と整合性保護に不可欠なセッションキー(共通鍵)の生成に使われます。
「プリ」がついているのがポイントで、後で「マスターシークレット」が生成されますよ。プリマスターシークレットの暗号化: クライアントは、サーバーから以前に受け取った公開鍵を使用してプリマスターシークレットを暗号化します。これにより、公開鍵に対応するプライベートキーを持つサーバーのみがこの情報を復号できるようになります。
Client Key Exchangeメッセージの送信: 暗号化されたプリマスターシークレットは、Client Key Exchangeメッセージの一部としてサーバーに送信されます。
![](https://assets.st-note.com/img/1714348949699-9dHUingyuj.png)
セッションキーの生成
サーバは、プリマスターシークレットを受け取りました。その後、個々がハイライトです。セッションキー(共通鍵)を作り出しますよ~。
プリマスターシークレットの復号化: サーバーは自身のプライベートキーを使用して、受け取った暗号化されたプリマスターシークレットを復号します。
取り出せるのは、このサーバだけですよ。プライベート鍵は誰とも共有してませんからね。これで、サーバーとクライアントは「同じプリマスターシークレット」を共有していることが保証されます。マスターシークレットの生成: クライアントとサーバーは共有されたプリマスターシークレットの他にも共通鍵生成に必要なものを持っています。それが、前の工程で交換したランダムなデータ「クライアントランダム」と「サーバーランダム」です。
この3つを材料として、「マスターシークレット」を生成します。あれ、生成されるのは「共通鍵」じゃなかったの?と言いたくなりますが、もうワンステップ必要です。
なお、「クライアントランダム」と「サーバーランダム」は盗聴できても、「プリマスターシークレット」は盗聴困難ですから、第三者は「マスターシークレット」を作り出せないわけですよ。セッションキーの導出:上記のマスターシークレットから、実際の通信に使用される「セッションキー」「MACキー」を導出します。この2つを作るのがミソですよ。
![](https://assets.st-note.com/img/1714349813554-sxhrK2PwTT.png)
鍵交換が終わると、クライアントは「Change Cipher Spec」メッセージを送り、これをもってセッションの暗号化が始まったことをサーバーに通知します。サーバーも同様に「Change Cipher Spec」を送信し、双方が共通の鍵で通信を暗号化する準備が整います。この時点で、通信は外部からの盗聴や改ざんから保護されるようになります。
よかった、よかった。
「セッションキー×MACキー」を使った暗号化通信
最後にどのように暗号化通信が行われるか、簡単に見てみましょう!
アプリケーションデータの準備:
送信するデータ(平文)が準備されます。MACの生成:
その送信データに対して「メッセージ認証コード(MAC)」が計算されます。これは、データの完全性を保証するためのもので、MACキーを使用してデータのハッシュ値を生成します。データとMACの結合:
次に、送信データとそのMAC値を結合します。暗号化の実施:
データとMAC値が結合された後、その全体をセッションキーを使用して暗号化します。この鍵は、通信のセキュリティを保持するために使用される鍵で、これによりデータの機密性が保護されます。送信:
暗号化されたデータ(アプリケーションデータとMAC値を含む)がネットワークを通じて送信されます。受信と検証:
受信側では、まず暗号化されたデータをセッションキーで復号します。その後、MAC値を抽出し、復号されたアプリケーションデータに対して再度MACを計算し、送信されてきたMAC値と比較します。この一致を確認することで、データが途中で改ざんされていないことを確認します。
こうやって、SSL/TLSでは機密性と完全性を同時に担保します!
![](https://assets.st-note.com/img/1714350942167-fug9AQ1Zks.png)
はい、本日は、ここまで!今回はSSL/TLSのハンドシェイクの後半をご紹介しました。共通鍵を交換するのではなく、その材料を交換していたのがミソでした。そして、作り出すのは、セッションキーとMACキーの2つであったところもポイントでした。
さて、次回はSSL/TLSのパケット構造を見ていきましょうか!
では!
この記事が気に入ったらサポートをしてみませんか?