SSL/TLSでは、クライアントとサーバーは、エフェメラルDiffie-Hellman交換を使用して、後続のマスターシークレットとセッションキーをシードするための共有シークレットを確立するオプションがあります。
DHEが2者間のキー交換として選択されている場合、どのようにしてDH ModPグループサイズを決定するのですか(その結果、PとGの番号に同意できるようになります)?
サーバーをDHE用に構成する の場合、Diffie Hellmanパラメーターを生成する必要があります。次に、生成したDHパラメータを使用するようにOpenSSL/Apache/Nginxなどを構成します。
使用するDHパラメータは、ServerKeyExchangeメッセージで送信されます。 ServerHelloおよびCertificateメッセージの後、ServerHelloDone。
ServerKeyExchangeメッセージには以下が含まれます。
struct {
select (KeyExchangeAlgorithm) {
case diffie_hellman:
ServerDHParams params;
Signature signed_params;
case rsa:
ServerRSAParams params;
Signature signed_params;
};
} ServerKeyExchange;
出典: RFC2246 セクション7.4.3
DHE暗号スイートでは、DHのモジュラスサイズはサーバーによって完全に選択され、許容可能なサイズに関するクライアントからの入力はありません(これは、DHE暗号スイートに関するTLSプロトコルの欠陥です)。
一部の履歴クライアント(Javaに同梱されているものを含むJava 7まで)は、1024ビットを超えるDH係数をサポートしていませんでした。 1024ビットのDHモジュラスに固執しますが、そのようなサイズは小さすぎると判断した人もいます。Apache+ OpenSSLは、数年前にその特定のジャンプを行いました。詳細は this を参照してください。
ECDHE(楕円曲線バージョン)では、使用する楕円曲線はサーバーによって選択されますが、クライアントがサポートする曲線を指定できる ClientHello拡張 があり、サーバーを許可します本当に情報に基づいた決定をするために。
サーバーはグループを選択し、クライアントに通知します。クライアントはこのプロセスに入力を提供しません。
ほとんどのサーバーはデフォルトのパラメーターセット(プライムとジェネレーター)で出荷されますが、2つの理由で独自のパラメーターを生成することをお勧めします。
残念ながら、サーバーが1024ビットより大きい素数を使用している場合、Java 7以前ではハンドシェイクに失敗します。
Java 6の場合、これに対する適切な解決策はありません。Java 6クライアントをサポートする必要がある場合は、 ECDHEまたは弱い1024ビットDSAパラメータをサポートしません。
Java 7の場合、ECDHE暗号スイートにDHE暗号スイートよりも高い優先順位を与えることにより、この問題を回避できます。