web-dev-qa-db-ja.com

opensslを介したハンドシェイクの開始時にサーバーに特定の楕円曲線を使用させるにはどうすればよいですか?

Opensslに、証明書またはキーで要求している特定の楕円曲線をサーバーに使用させる可能性またはコマンドはありますか?使用できる曲線をプロセスに「尋ねる」ことはできますか?

3
SmithCorner

あなたの質問は曖昧であり、答えはかなり異なります。

プロトコル ClientHelloメッセージのsupported-curves拡張機能は、クライアントがサーバーを使用する意思のある曲線(標準/名前付き、または「明示的」GF(2 ^ k)またはGF(p))を指定します。使用する。複数を指定する場合、サーバーはそれらのいずれかを選択できます。指定されている場合、サーバーが使用できるのはそれだけです。サーバーがまたは指定された曲線をサポートしていない場合、ネゴシエーションはECスイートを選択できません。また、他のスイートが両端でサポートされ、受け入れられない限り、ネゴシエーションは失敗します。

任意のサーバーへのOpenSSLクライアントから1.0.1は常にこの拡張機能を送信して、すべての名前付き曲線(rfc4492内)を許可し、明示的な曲線を許可しません。 RedHat(AFAIKはまだですか?)を除いて、OpenSSLビルドをP-256、P-384、およびP-521のみにノブルします。 1.0.2この拡張機能を制御するための新しいAPI呼び出しを追加します。 https://www.openssl.org/docs/ssl/SSL_CTX_set1_curves_list.html を参照してください。したがって、RedHatではなく1.0.2 *に対してクライアントプログラムをコーディングしてビルドするか、クライアントプログラムを管理している人にそうしてもらいます。

ECDHEのOpenSSLサーバーへのすべてのクライアント 1.0.1までのOpenSSLサーバーは、SSL_CTXを共有するすべての接続に対して、またはSSL接続ごとに個別にECDHEの「一時パラメーター」を使用して、ハンドシェイクの前に構成できます。曲線です(ありますか?)構成された曲線のみが鍵交換に使用されます。 ECDHE-ECDSAの場合、cert内の公開鍵(対応する秘密鍵とともに)をauthenticateに使用し、異なる曲線;そのキーとカーブは、証明書が発行されてCAによって「承認」される前に選択されたものであり、現在は変更できません。一方、「一時的な」ECDHEの選択は、サーバーコードまたは構成によって行われます。 「一時」曲線、または証明書がECCの場合の証明書曲線のいずれかがクライアントによって許可されたリストにない場合、ECDHEまたはECDHE-ECDSAはネゴシエートできません。

サーバーは、事前に構成する代わりに、OpenSSLライブラリによって呼び出されるコールバックを設定して、特定のハンドシェイクのECDHE曲線(またはキー)を選択できます。これは、サーバーに受け入れられない場合を除いて、クライアントに受け入れられる曲線を選択する必要があります。繰り返しますが、ECDHE-ECDSAの場合、認証の証明書の曲線は異なる可能性があり、発行前にすでに選択されており、変更できません。また、クライアントに受け入れられない場合は、交渉できません。最後に、1.0.2の新機能として、認証の強度を「一致」させながら、OpenSSLがクライアントに受け入れられるECDHE曲線を自動的に選択するオプションがあります。

静的ECDHのサーバーでは、キー交換に使用される曲線(およびキー)は証明書内のものであり、上記のように証明書が発行される前に選択されたものであり、変更できません。この曲線がクライアントに受け入れられない場合、ECDHはネゴシエートできません。

4

Opensslに、サーバーに特定の楕円曲線を使用させる可能性またはコマンドはありますか?

一般的に、CONFファイルを介してこれを行う方法がわかりません。 SSL_CONF_* AP​​I呼び出し(以下に表示)は、構成ファイルの一部である可能性があることを示しているようです。しかし、私はそれをしたことがありません。


Opensslを介したハンドシェイクの開始時にサーバーに特定の楕円曲線を使用させるにはどうすればよいですか?

できますが、ソースを変更する必要があります。これは、プライベートメールのOpenSSL開発者の1人からのものです。ただし、以下に説明するパッチ適用方法を使用しているため、実際に機能するかどうかはわかりません。

Under 0.9.x:
         int nid = OBJ_sn2nid(named_curve);
         ecdh = EC_KEY_new_by_curve_name(nid);
         SSL_CTX_set_tmp_ecdh(ctx,ecdh);
         EC_KEY_free(ecdh);

 Under 1.x:
         SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
         SSL_CONF_cmd(cctx, "-named_curve", "P-256");
         SSL_CONF_CTX_finish(cctx);

1.0.1以下の場合、ソースをt1_lib.cに変更できます。特に、ssl_prepare_clienthello_tlsextpref_listを見つけて、好きなように変更してください。デフォルトでは次のようになります。

static int pref_list[] =
 {
   NID_sect571r1, /* sect571r1 (14) */
   NID_sect571k1, /* sect571k1 (13) */
   NID_secp521r1, /* secp521r1 (25) */
   NID_sect409k1, /* sect409k1 (11) */
   NID_sect409r1, /* sect409r1 (12) */
   NID_secp384r1, /* secp384r1 (24) */
   NID_sect283k1, /* sect283k1 (9) */
   NID_sect283r1, /* sect283r1 (10) */
   NID_secp256k1, /* secp256k1 (22) */
   NID_X9_62_prime256v1, /* secp256r1 (23) */
   NID_sect239k1, /* sect239k1 (8) */
   NID_sect233k1, /* sect233k1 (6) */
   NID_sect233r1, /* sect233r1 (7) */
   NID_secp224k1, /* secp224k1 (20) */
   NID_secp224r1, /* secp224r1 (21) */
 };

問題#3179:機能要求:クライアントのEC曲線の設定リストの設定 も参照してください。


OpenSSL 1.0.2以降の場合、 SSL_CTX_set1_curves を使用できます。 pref_listは、ソースをgrepするときに存在しなくなりました。

1
jww