Теперь, когда это перемещено туда, где это актуально, и достаточно прояснено, вечеринка окончена:
Эфемерные наборы ECDH: наборы TLS, которые используют обмен эфемерными ключами ECDH (ECDHE-*
), используют по крайней мере номинально эфемерные ключи ECDH, которые OpenSSL называет «временными». OpenSSL до 1.0.2 имеет 4-6 способов установки этих ключей:
SSL_CTX_set_tmp_ecdh
или SSL_set_tmp_ecdh
установите (только) используемую «кривую»; если быть точным, это EC_GROUP
или формально «набор параметров», который состоит из фактической кривой, определяемой уравнением кривой основного поля, плюс заданная базовая точка, которая создает подгруппу на кривой достаточно высокого порядка и низкого кофактора, но в большинстве случаев мы игнорируем эту деталь и просто называем ее «кривой». Затем OpenSSL генерирует случайный ключ на этой кривой для каждого рукопожатия и во время него.
SSL_CTX_set_tmp_ecdh_callback
или SSL_set_tmp_ecdh_callback
устанавливает функцию, которая вызывается во время каждого рукопожатия и может либо установить определенный ключ, либо установить кривую, и OpenSSL генерирует случайный ключ на этой кривой.
SSL_CTX_set_ecdh_auto
или SSL_set_ecdh_auto
новое в 1.0.2 заставляет OpenSSL во время каждого рукопожатия выбирать кривую на основе приветствия клиента и генерировать случайный ключ на этой кривой.
Обратите внимание, что каждый набор шифров, использующий ECDHE, также определяет тип ключа с соответствующей цепочкой сертификатов, которую сервер должен использовать для аутентификации: ECDHE-RSA
должен использовать ключ и сертификат RSA, а ECDHE-ECDSA
должен использовать ключ и сертификат ECDSA (или, если быть точным, ключ EC и сертификат ECDSA, поскольку один и тот же Ключ EC можно использовать для ECDSA, ECDH, ECIES и т. д., но обычно этого делать не следует). Библиотека OpenSSL может быть настроена с несколькими парами ключей и сертификатов, по одной каждого типа, а командная строка s_server
может создавать две статические пары, используя -cert -key -dcert -dkey
плюс одну для SNI -cert2 -key2
, но другие программы могут или не могут.
Однако в версии 1.1.0 эти функции удалены, и кажется, что OpenSSL всегда делает то, что раньше было ecdh_auto
.
Статические пакеты ECDH. Наборы TLS, использующие статический обмен ключами ECDH (ECDH-*
), используют статический ключ ECDH и не используют эфемерный или временный ключ ECDH. Поскольку они не используют временный ключ, функции, связанные с установкой временной кривой или ключа, не имеют значения и не имеют никакого полезного эффекта. Вместо этого статический ключ ECDH должен быть в настроенной паре ключа и сертификата сервера, а сертификат должен разрешать использование ECDH, т. е. он не должен содержать keyUsage
, исключающего keyAgreement
. Кроме того, в TLS 1.0 и 1.1 сконфигурированный сертификат должен быть подписан центром сертификации с использованием алгоритма подписи, соответствующего набору шифров: наборы ECDH-ECDSA
шифров должны использовать сертификат ECDH, подписанный центром сертификации ECDSA, а наборы ECDH-RSA
наборов шифров должны использовать сертификат ECDH, подписанный RSA. ЦА; см. rfc4492, раздел 5.3. Для TLS 1.2 rfc 5246, раздел 7.4.2 и A.7 для ECC смягчает это требование и разрешает CA любой алгоритм, разрешенный клиентским расширением signal_algorithms. Однако при проверке я обнаружил, что OpenSSL не реализует это ослабление, поэтому часть моего предыдущего комментария неверна; даже для версии 1.2 требуется, чтобы алгоритм подписи ЦС соответствовал набору шифров.
Кроме того, для всех версий протокола ключ и (EE) сертификат должны использовать кривую, поддерживаемую клиентом в расширении support_curves, а сертификат должен выражать этот ключ в «именованной» форме (с использованием OID для идентификации кривой, а не явных параметров). и формат точки, поддерживаемый клиентом в расширении support_formats. С клиентом OpenSSL это не проблема, потому что он поддерживает все именованные кривые и форматы точек, а на практике сертификаты не используют явные параметры кривой.
Таким образом, чтобы получить статический ECDH с OpenSSL:
настройте сервер с помощью ключа EC (SSL_[CTX_]use_PrivateKey*
) и соответствующего сертификата (SSL_[CTX_]use_certificate[_chain]*
), который разрешает keyAgreement и подписан ЦС с использованием RSA или ECDSA, и, как и все наборы шифров на основе PK, также настройте любые сертификаты цепочки, необходимые клиенту (ам). для проверки сертификата
настройте оба конца, чтобы разрешить (что верно по умолчанию), и по крайней мере один конец, чтобы потребовать, или предпочтительный конец, чтобы предпочесть шифровальный набор (ы), используя ECDH-xyz
, где xyz
- это RSA
или ECDSA
, чтобы соответствовать подписи CA на сертификате сервера
полностью игнорировать ecdh_tmp
и ecdh_auto
... за исключением версии 1.1.0, в которой при проверке я обнаружил, что больше не реализуются какие-либо наборы шифров статического ECDH или статического DH, хотя наборы статического DH все еще находится на странице руководства для шифров. Этого нет в файле CHANGES, который я могу найти, и у меня еще не было времени просмотреть код.
02.01.2017
openssl ciphers -v kECDH
. В общем, помните, что RedHat, как и Debian и другие, переносит исправления безопасности в более ранние версии (часть-42
вашей версии RPM); Я не вижу никаких причин, по которым это должно быть исправлением безопасности, но, не глядя на источник, я не могу быть в этом уверен. 06.01.2017