Arhn - архитектура программирования

Может ли кто-нибудь сказать мне, как заставить сервер выбирать шифр ECDH_* вместо ECDHE_*?

Я использую шифр RSA для подписи сертификата и API SSL_CTX_set_tmp_ecdh_callback() для установки параметров ECDH для обмена ключами. Сервер всегда выбирает набор шифров TLS_ECDHE_RSA_*. Если я заставлю клиента отправлять только комплекты шифров TLS_ECDH_* в clientHello, сервер разорвет соединение с сообщением «нет общего шифра».

Может ли кто-нибудь сказать мне, как заставить сервер выбирать шифр ECDH_* вместо ECDHE_*?

Как сервер решает, что я должен выбрать шифр ECDH_* вместо шифров ECDHE_*?

27.12.2016

  • Эта вики предназначена для использования ECDH отдельно, НЕ в SSL/TLS. Наборы шифров, использующие статический обмен ключами ECDH, не используют временный, также известный как эфемерный ключ ECDH, и, таким образом, не связаны с процедурами, которые устанавливают временный, также известный как эфемерный ключ ECDH. Вам необходимо: (1) на сервере использовать ключ EC с соответствующим сертификатом/цепочкой, которому доверяет клиент и не имеет KeyUsage, запрещающего соглашение о ключах, и не использует форматы кривой и/или точки, нарушающие поддерживаемые клиентом кривые и поддерживаемые форматы (если клиент использует openssl этот последний пункт никогда не является проблемой); ... 28.12.2016
  • ... (2) либо установить только наборы статических шифров ECDH по крайней мере на одной конечной точке, либо включить их на обоих концах (что делает openssl по умолчанию) и предпочесть их (что openssl не делает по умолчанию) в конце, у которого есть предпочтение (по умолчанию клиент, но вы можете изменить это); (3) для TLSv1.0 и 1.1 сертификат EC сервера должен быть подписан ЦС с использованием типа открытого ключа, указанного kx в наборе шифров; для 1.2 это не применяется, вместо этого в подписи ЦС должен использоваться тип хэша и открытого ключа, удовлетворяющий клиентским сигалам, см. rfc5246, раздел 7.4.2. Но, как уже было сказано, stackoverflow — самое подходящее место для этого. 28.12.2016
  • Спасибо за ответ @dave_thompson_085. 28.12.2016
  • (1) Да, у меня есть ключ EC, сгенерированный на стороне сервера с помощью API SSL_CTX_set_tmp_ecdh_callback. (2) Я попытался установить только ECDHstatic на стороне клиента, когда сервер закрыл соединение, заявив, что общий шифр отсутствует. (3) Я пробую версию TLS версии 1.2. Что касается подпрограмм, которые устанавливают временные ключи ECDH, я сомневаюсь, что SSL_CTX_set_tmp_ecdh_callback можно использовать только для установки шифров ECDHE_*, а не шифров ECDH_*. 28.12.2016

Ответы:


1

Теперь, когда это перемещено туда, где это актуально, и достаточно прояснено, вечеринка окончена:

Эфемерные наборы 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
  • Почти понял все, что вы упомянули. Еще бы попробовать. Однако есть одно сомнение относительно последнего пункта, который вы упомянули: ... кроме 1.1.0. Таким образом, вы имеете в виду, что только версии openssl ниже 1.1.0 поддерживают только статические шифры ECDH *. Я использую коробку RHEL7, которая показывает версию openssl 1.0.1e-42. Так что, думаю, я здесь в безопасности. 04.01.2017
  • @neo: Пока я протестировал только одну сборку 1.1.0, хотя обычно она хорошая (ShiningLight для Windows). Я ожидаю, что любая версия 1.0.1 подойдет для этого, но проверьте, например, openssl ciphers -v kECDH. В общем, помните, что RedHat, как и Debian и другие, переносит исправления безопасности в более ранние версии (часть -42 вашей версии RPM); Я не вижу никаких причин, по которым это должно быть исправлением безопасности, но, не глядя на источник, я не могу быть в этом уверен. 06.01.2017

  • 2

    ... за исключением 1.1.0, который при проверке я обнаружил, что больше не реализует наборы шифров static-ECDH или static-DH - даже несмотря на то, что наборы static-DH все еще находятся на странице руководства для шифров. Этого нет в файле CHANGES, который я могу найти, и у меня еще не было времени просмотреть код.

    https://github.com/openssl/openssl/commit/ce0c1f2bb2fd296f10a2847844205df0ed95fb8e

    18.10.2019
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..