1995年、当時の主流ブラウザ・ベンダーであったネットスケープは、この需要を満たすべく、
SSL(Secure Sockets Layer:セキュアソケット層)と呼ばれるセキュリティ・パッケージ
を発表した。SSLは、現在はTLS(Transport Laryer Security: トランスポート層セキュリティ)
と呼ばれている。このソフトウェアとプロトコルは、今やFirefox, Brave, Safari, Chrome等において広く使われている。
この需要とはクレカ情報などの重要な情報を取り扱うようになったということだ。
SSLは現在TLS(トランスポート層セキュリティ)と呼ばれている。
SSLの機能
- クライアントとサーバーの間のパラメータの決定
- クライアントによるサーバーの認証
- 秘密通信
- データの完全性保護
クライアントとサーバーの間のパラメータの決定とは何のパラメータだろうか?
TLSハンドシェイクの手順
TLSハンドシェイクは、クライアントとサーバーによって交換される一連のデータグラムまたはメッセージです。クライアントとサーバーがハンドシェイクを完了し、その後のやりとりができるよう必要な情報を交換するために、TLSハンドシェイクは複数のステップを経て行われます。
TLSハンドシェイク内の具体的な手順は、使用される鍵交換アルゴリズムの種類と、両側でサポートされる暗号スイートによって異なります。RSA鍵交換アルゴリズムは、現在では安全ではないと考えられていますが、1.3以前のTLSのバージョンで使用されていました。おおよそ次のような流れになります。
- 「Client Hello」メッセージ:クライアントがサーバーに「Hello」というメッセージを送信することによってハンドシェイクを開始します。このメッセージには、クライアントがサポートするTLSのバージョン、
対応する暗号スイート
、「クライアントランダム」
というランダムなバイト文字列が含まれています。- 「Server Hello」メッセージ:Client Helloメッセージへの返答として、サーバーがメッセージを送ります。このメッセージには、サーバーのSSL証明書、
選んだ暗号スイート
、サーバーが生成した別のバイト文字列「サーバーランダム」
が含まれています。- 認証:クライアントはサーバーのSSL証明書を発行元の認証局に確認します。これにより、サーバーが自称する本人に間違いなく、クライアントはそのドメインの実際の所有者とやりとりしていることが確認されます。
- プレマスタシークレット:クライアントは、
「プレマスタシークレット」と呼ばれるもう1つのランダムなバイト文字列を送信
します。プレマスタシークレットはパブリック鍵で暗号化されており、復号化は秘密鍵を使うサーバーしか行えません。(クライアントはサーバーのSSL証明書からパブリック鍵(公開鍵)を入手します。)- 使用される秘密鍵:
サーバーはプレマスタシークレットを解読
します。- セッション鍵の生成:クライアントとサーバーは共に
クライアントランダムとサーバーランダム、プレマスターシークレットからセッション鍵を生成
します。双方とも同じ結果になるはずです。- クライアントの準備完了:クライアントは、セッション鍵で暗号化された「finished(完了)」のメッセージを送信します。
- サーバーの準備完了:サーバーは、セッション鍵で暗号化された「finished(完了)」のメッセージを送信します。
- セキュアな対称暗号化の実現:ハンドシェイクが完了し、
セッション鍵を使用して通信が続行
されます。すべてのTLSハンドシェイクは、非対称暗号(公開鍵と秘密鍵)を使用しますが、すべてのセッション鍵の生成プロセスで必ず秘密鍵を使用するというわけではありません。たとえば、一時的なDiffie-Hellmanハンドシェイクは次のように進行します。
プリマスタシークレット
サーバーの認証に成功すると、クライアントは「プリマスタシークレット」と呼ばれるランダム値を作成し、証明書に含まれる公開鍵を使って暗号化します。
生成するパラメータ
クライアント側:クライアントランダム、プレマスタシークレット(サーバーの認証に成功後)
サーバー側:サーバーランダム
両方でセッション鍵を生成
クライアント、サーバー両方同じ3つのパラメータを持っているので同じセッション鍵を生成するはずです。
セッション鍵を作るためのパラメータ
セッション鍵を生成にクライアントランダムとサーバーランダム、プレマスターシークレットのパラメータを使うからセッション鍵を生成するためのパラメータだった。
- Client Hello:クライアントは、
プロトコルのバージョン
、クライアントランダム
、暗号スイートのリスト
を含む「Client Hello」メッセージを送信します。- Server Hello:サーバーはSSL証明書、
選んだ暗号化スイート
、サーバーランダム
を返信します。上述のRSAハンドシェイクとは違い、サーバーはこのメッセージに次の内容(ステップ3)も含めます。- サーバーのデジタル署名:サーバーは、ここまでのすべてのメッセージのデジタル署名を計算します。
- デジタル署名確認完了:クライアントはサーバーのデジタル署名を検証し、サーバーが自称する本人に間違いないことを確認します。
- クライアントDHパラメーター:クライアントは、
サーバーにDHパラメーターを送信
します。- クライアントとサーバーがプレマスタシークレットを計算:
クライアントがプレマスタシークレットを生成
してサーバーに送信する代わりに、RSAハンドシェイクのように、クライアントとサーバーが交換したDHパラメーターを使用してマッチするプレマスタシークレットを個別に計算
します。- セッション鍵の作成:次に、クライアントとサーバーが、RSAハンドシェイクの時と同様に、
プレマスタシークレット、クライアントランダム、サーバーランダムからセッション鍵を計算
します。- クライアントの準備完了:RSAハンドシェイクと同様
- サーバーの準備完了
- セキュアな対称暗号化を実現
- クライアントがプレマスタシークレットを生成してサーバーに送らない
DHパラメーター
DHパラメーター:DHはDiffie-Hellmanの略です。Diffie-Hellmanアルゴリズムは、
指数計算によって同じプレマスターシークレットに到達
します。サーバーとクライアントはそれぞれ計算用のパラメーターを提供し、それらを組み合わせてそれぞれの側で異なる計算を行いますが、結果は等しく
なります。一時的Diffie-Hellmanハンドシェイクと他種のハンドシェイクの比較と、それらがどのように前方秘匿性を実現するかについて、詳しくはWhat is Keyless SSL?をご参照ください。
暗号スイートとは?
暗号スイートは、安全な通信接続を確立するために使用するアルゴリズムのセットです。広く使われる暗号スイートは数多くあります。TLSハンドシェイクの重要な部分は、どの暗号スイートをハンドシェイクに使用するかについての合意です。
TLSのバージョン
初めて開発された「SSL1.0」は、リリース前に脆弱性が発見され公開に至りませんでした。
その後開発された「SSL2.0」では、製品に実装された後に脆弱性が発見され、多くのウェブブラウザでSSL2.0を無効とする初期設定が行われました。ごく最近まで広く使用されていた「SSL3.0」は、2014年に重大な脆弱性である「POODLE(CVE-2014-3566)」が発見されました。このため、現在ではサーバでのSSL3.0の利用は非推奨とされ、また多くの主要ブラウザで「SSL3.0」が無効となりました。
また「POODLE」においては、実装が不十分な「TLS1.0/1.1」の場合もサーバとの通信において脆弱性があることが確認され、TLS1.0/1.1の利用は非推奨となっております。この他、2014年と2015年に発覚したOpenSSLの脆弱性「Heartbleed」「FREAK」など、場合によってはOpenSSLのアップグレードやSSLサーバ証明書の入れ替えが必要になるケースもありました。
バージョンがズレると昔のバージョンに合わせなくては行けなくなるため脆弱性が出てしまう。
デジタル署名
送る内容を使ってデジタル署名を作成するためSSL証明書、選んだ暗号化スイート、サーバーランダムでデジタル署名を作成すると考える
感想
TLSハンドシェイクとDiffie-Hellmanハンドシェイクのプリマスタシークレットを作成する段階が違いったことを知った。