私はクライアントとサーバー間のSSL/TLSハンドシェイクについてたくさん読んでいます、そしてそれに関する多くの記事は非常に矛盾しています。
2つのパーティ間の通信に使用される対称鍵はクライアントからサーバーに送信される(ofc、サーバーの公開鍵で暗号化される)と言われる人もいます。
DHアルゴが使用されていて、最初にクライアントが共有キーの生成に役立つプリマスターシークレットを送信すると言う人もいます(なぜプリマスターシークレットは最初から暗号化されているので、攻撃者は機密情報を取得しません)。
混乱しているのは、共有対称鍵での生成の全体的なフローです。 a)DHは使用されていますか(使用されていない場合、対称鍵はどのように生成されますか、クライアントはそれを提案し、RSA暗号化を介して送信します。それですべてですか?)
B)DHが使用されている場合、誰が最初に開始しますか?シークレットを生成するために使用する全体的な素数を最初に提案し、次にそれらの計算を送信する(または全体的なアルゴリズムを事前に決定する)誰かがいる必要がありますか?
すでに述べたように、対称セッションキーを交換する方法は2つあります。key encipherment
またはkey agreement
(Diffie-Hellmanアルゴリズムに基づく)を使用する方法です。両方のアルゴリズムは同時に使用されません。たとえば、Microsoft SChannelクライアントはサーバー証明書のKeyUsages
拡張(ビット文字列)からビットを読み取り、設定されているビットに応じて、キー交換アルゴリズムが使用されます。
鍵暗号化を使用する場合:
Diffie-Hellman(鍵合意)の場合、当事者は共通の素数p
とジェネレーター番号g
を共有し、両方の当事者がこれらの値に同意する必要があるため、誰が開始するかには大きな違いはありません。 。これらの数は公に合意することができます。したがって、合意開始者はプロトコルのメッセージ構文の問題にすぎません。
その後、次のプロセスが発生します(これは明確に定義されています)。
詳細なDH鍵交換アルゴリズムは RFC2631 で説明されています。