TLS - кривые, используемые для ECDHE - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу спросить о том, как TLS принимает решение об алгоритме обмена ключами (выбор кривой).

Связь между клиентом и сервером осуществляется по TLS.Сервер работает на том же компьютере, что и клиент, и оба имеют доступ к одним и тем же сертификатам.И клиент, и сервер вызывают SSL_CTX_set_cipher_list, чтобы установить для шифра ECDHE-ECDSA-AES128-GCM-SHA256.

Сертификаты и ключи, примененные во время связи, были созданы с помощью ecparam name_curve secp521r1.

Когдасервер вызывает SSL_CTX_set_ecdh_auto все работает просто отлично.Однако, когда сервер пытается ограничить кривые значением secp521r1, вызвав SSL_CTX_set1_curves_list, клиент не может подключиться.Кажется, что кривая secp521r1 не используется для ECDHE.

Мой вопрос: почему?

1 Ответ

0 голосов
/ 02 февраля 2019

Мне нравится использовать этот веб-сайт для описания протокола TLS.

При первоначальном подключении клиента он отправляет пакет "Hello Hello".В пакете есть раздел для «поддерживаемых наборов шифров» (см. A.5 RFC ).Если сервер не поддерживает ни один из поддерживаемых наборов шифров, он будет отклонять соединение в этой точке.

Начиная с 7.4.1.2.Привет клиента RFC :

Список комплектов шифров, переданных от клиента серверу в сообщении
ClientHello, содержит комбинации криптографических алгоритмов
поддерживается клиентом в порядке предпочтения клиента
(сначала предпочтительный вариант).Каждый набор шифров определяет алгоритм обмена ключами
, алгоритм массового шифрования (включая длину секретного ключа), алгоритм MAC и PRF.Сервер выберет набор шифров или, если приемлемые варианты не представлены, вернет предупреждение о сбое
и закроет соединение.Если список содержит наборы шифров
, которые сервер не распознает, не поддерживает или не хочет использовать, сервер
ДОЛЖЕН игнорировать эти наборы шифров и обрабатывать оставшиеся наборы
как обычно.

Так что, скорее всего, вы ограничили параметры сервера тем, что клиенты не поддерживают.Если клиент поддерживает ECDHE-ECDSA-AES128-GCM-SHA256, это должно сработать.Я также предполагаю, что вы не отключили другие необходимые наборы шифров (например, алгоритм массового шифрования и т. Д.)

ОБНОВЛЕНИЕ: я не могу сказать, что понимаю, что происходит, но просматривая исходный код opensslкод, API SSL_CTX_set1_curves_list не предоставляется командной строке openssl ни в одном из вариантов, которые я могу найти.

openssl предоставляет параметр "- named_curve" :

-named_curve кривая Определяет используемую эллиптическую кривую.ПРИМЕЧАНИЕ. Это одна кривая, а не список.

Примечание: это разрешение влияет на серверы, а не на клиентов.

При этом используется API SSL_CTX_set_tmp_ecdh / SSL_set_tmp_ecdh .Это имеет больше смысла для меня в том, что вы говорите выше, чтобы ограничить варианты ECDH.Я обычно выставляю этот API своим опциям на стороне сервера.

...