![見出し画像](https://assets.st-note.com/production/uploads/images/138722247/rectangle_large_type_2_fd188e78eec78e961b1112ea7069ea90.png?width=1200)
こうして安全な通信は確立される!SSL/TLSハンドシェイク(前編)
はい、こんにちは!松井真也です。
シリーズ「毎日あなたが安全にウェブ利用できるスゴイ仕組み:SSL/TLS」の第6回でございます!
前回は、SSL/TLSで使用する暗号方式のうち、「改ざん検知」と「サーバ認証」を行う「ハッシュ関数」について学びました。特に、ハッシュ関数の性質を確認しました。どんなサイズのデータを入れても、衝突しないハッシュ値が固定長で出力されるのですよ。不思議ですよね。数学的に理解できたら楽しいのだろうな…。
さて、今回は、SSL/TLSによる接続開始から終了までのフローをご紹介します。公開鍵暗号方式を利用して、共通鍵暗号方式の鍵を配送して、その暗号鍵で安全に通信するのでしたね。これを確立する手順を少し掘り下げるのが今回の狙いです。
本当は、バージョンによって細かい違いがあるのですが、ここでは概要を掴めれば、それでよしとしましょう!
![](https://assets.st-note.com/img/1714251410746-uBjpCCc3L2.png)
Client Hello:「使える暗号はコチラです!」
SSL/TLSハンドシェイクのプロセスは、安全な通信を確立するための大切な手順でございます。
サーバ証明書は準備できていることが前提で話を進めます。
まず、このプロセスは「Client Hello」というメッセージから始まります。このメッセージは、クライアントがサーバーに対して通信を開始する意向を伝えるものです。クライアントがサーバに「こんにちは!」と話しかけるわけですな。
以下の主要な要素を含んでいます。
SSL/TLSのバージョン:
クライアントは、サポートしているSSL/TLSのバージョンをリストアップしてサーバに送信します。これにより、サーバはクライアントと互換性のある最も安全なプロトコルバージョンを選択できます。暗号化方式の一覧:
これらは「暗号スイート」としても知られ、暗号化方式、ハッシュ関数を指定します。クライアントは、サポートする暗号スイートのリストを提供し、サーバーはその中から選択することができます。セッションID:
セッションIDは、以前に確立されたセッションを再利用することを可能にする識別子です。クライアントランダム:
クライアントランダムは、セッションキー(共通鍵)を生成する際の一部として使用されます。クライアントとサーバーの両方がランダム値を提供し、これらの値はセキュアな通信を確立するために組み合わされます。
うーん、単なる「こんにちは」でなく、しっかりと「こんな暗号方式が使えますよ!」と大事なことを伝えているのですね。
![](https://assets.st-note.com/img/1714251456723-WlF6mUkeXO.png)
Server Hello:「じゃ、この暗号方式で!」
続いて、サーバからも「こんにちは!」と返事をします。「Server Hello」です。もちろん、ただの挨拶ではありません。暗号スイートを決定しますよ。例えば次のようなデータを送ります。
暗号化方式の選択: サーバーはクライアントが送信した暗号スイートのリストから、サポートされておりセキュリティが確保された暗号化方式を選択します。どれを選択するかは、クライアントとサーバーの両方がサポートする「最強の暗号化方式」に基づくことが一般的です。
サーバーランダム: 上記の「クライアントランダム」に対応するものですね。サーバーは自身のランダムなデータを生成し、これをクライアントに送信します。このランダムなデータは後のプロセスでセッションキーの生成に使用されます。
![](https://assets.st-note.com/img/1714251502827-sjO9yHFS9L.png)
Server Certificate:「正真正銘のワタクシでございます」
続いて、第3者の力によりサーバは自分の身元の証明をおこないますよ。
1.SSLサーバ証明書の提供:
サーバーは自身の身元を証明するために、SSLサーバ証明書をクライアントに送信します。この証明書は公開鍵基盤(PKI)の一部として、認証局(CA)によって発行されるものです。
2.サーバ証明書:
サーバーは自身のサーバ証明書を送ります。
3.証明書の検証:
クライアントは受け取った証明書を検証することで、サーバーが実際に自称する組織や個人であるかを確認します。これは、証明書に含まれる公開鍵を使ってサーバーから送られてくる情報の「デジタル署名」を検証することにより行われます。
これで確かに通信相手が本物であることが確認できました!
![](https://assets.st-note.com/img/1714251545805-yy0MD754xT.png)
ここで、ハンドシェイクの手順をいったん区切りましょう。これでプロセスの半分くらいはお話しできました。
次回は、SSL/TLSハンドシェイクの続きをやりましょう!
この記事が気に入ったらサポートをしてみませんか?