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

4115
SmithCorner

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

4
Вы можете указать в файле конфигурации user45475 8 лет назад 0
Вы имеете в виду ECDHE? StackzOfZtuff 8 лет назад 0
Да. Это следует использовать для обмена ключами. Просто ECDH тоже возможно. 8 лет назад 0

2 ответа на вопрос

5
dave_thompson_085

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

Протокол. Расширение поддерживаемых кривых в сообщении 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
jww

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

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


Как заставить сервер использовать определенную эллиптическую кривую в начале рукопожатия через 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больше не присутствует при поиске источников.

Похожие вопросы