4

Есть ли возможность или команда в openssl, чтобы заставить сервер использовать определенную эллиптическую кривую, которую я запрашиваю с сертификатом или ключом? Могу ли я "задать" процессу кривые, которые он может использовать?

2 ответа2

5

Ваш вопрос неоднозначен и ответы совершенно разные.

Протокол. Расширение поддерживаемых кривых в сообщении ClientHello определяет кривые (стандартные / именованные или «явные» 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 . Так что либо кодируйте и собирайте свою клиентскую программу под 1.0.2 *, а не в RedHat, либо попросите того, кто поддерживает вашу клиентскую программу, сделать это.

Любой клиент на сервере OpenSSL для ECDHE. Сервер OpenSSL через 1.0.1 может быть настроен до рукопожатия, либо для всех соединений, совместно использующих SSL_CTX, либо для каждого соединения SSL в отдельности, с ECDHE "временными параметрами", которые есть (являются?) Кривая. Только настроенная кривая используется для обмена ключами. Для ECDHE-ECDSA публичный ключ в сертификате, используемый (с соответствующим личным ключом) для аутентификации, может использовать другую кривую; этот ключ и кривая были выбраны до того, как сертификат был выдан и "одобрен" ЦС, и теперь не могут быть изменены, тогда как "временный" выбор ECDHE определяется кодом или конфигурацией сервера. Если либо кривая "temp", либо кривая cert, когда сертификат ECC, отсутствует в списке, разрешенном клиентом, то ECDHE или ECDHE-ECDSA не могут быть согласованы.

Вместо предварительной настройки сервер может установить обратный вызов, вызываемый библиотекой OpenSSL, для выбора кривой ECDHE (или ключа) для конкретного рукопожатия. Для этого следует выбрать кривую, приемлемую для клиента, если только она неприемлема для сервера. Снова для ECDHE-ECDSA, кривая в сертификате для аутентификации может быть другой, уже была выбрана до выпуска и не может быть изменена, и если не приемлема для клиента, не может быть согласована. Наконец, в 1.0.2 появилась возможность для OpenSSL автоматически выбирать кривую ECDHE, приемлемую для клиента, при этом "сопоставляя" степень аутентификации.

В сервере для статического ECDH кривая (и ключ), используемая для обмена ключами, является кривой в сертификате, которая, как указано выше, была выбрана до выдачи сертификата и не может быть изменена. Если эта кривая неприемлема для клиента, ECDH не может быть согласован.

2

Есть ли возможность или команда в openssl, чтобы заставить сервер использовать определенную эллиптическую кривую

В общем, я не уверен, как это сделать с помощью файла CONF. Вызовы API SSL_CONF_* (показанные ниже), похоже, указывают на то, что они могут быть частью файла конфигурации. Но я никогда этого не делал.


Как заставить сервер использовать определенную эллиптическую кривую в начале рукопожатия через openssl?

Вы можете, но вы должны изменить свои источники. Вот от одного из разработчиков OpenSSL в личной электронной почте. Но я не уверен, что это работает на практике, потому что я использую метод исправления, описанный ниже.

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_tlsext и pref_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 больше не присутствует при поиске источников.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .