Назад | Перейти на главную страницу

Эллиптическая кривая TLS не поддерживается

У меня есть встроенное устройство, использующее mBedTLS, я пытаюсь установить соединение с https://www.cloudflare.com и не работает:

#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00  /**< Elliptic curve is unsupported (only NIST curves are supported). */

Из-за аппаратных ограничений устройство поддерживает только следующие кривые:

MBEDTLS_ECP_DP_SECP192R1
MBEDTLS_ECP_DP_SECP224R1
MBEDTLS_ECP_DP_SECP256R1

И включены следующие расширения TLS:

Supported Elliptic Curves
Supported Point Formats

Смотрим на сертификаты cloudflare.com: https://www.ssllabs.com/ssltest/analyze.html?d=www.cloudflare.com&s=104.17.210.9

Я вижу, что cloudflare.com поддерживает сертификаты RSA и ECDSA.

Сертификат сервера ECDSA использует 256-битный ключ EC, но эмитент этого сертификата использует 384-битный ключ EC.

Это то, что вызывает сбой устройства. Устройство не может проверить 384-битный сертификат в цепочке.

Итак, это проблема с cloudflare.com? Должен ли сервер видеть, что клиент не поддерживает все кривые в своей цепочке сертификатов, и вместо этого вернуться к сертификатам RSA?

то есть устройство предоставляет список поддерживаемых кривых, но сервер возвращает цепочку сертификатов с неподдерживаемым EC в цепочке. Ожидается ли, что сервер рассмотрит расширение TLS «Поддерживаемые эллиптические кривые», предоставленное клиентом, и вернет только цепочку сертификатов, если все кривые поддерживаются?

Любое понимание приветствуется.

Если вы не уверены, как протокол должен себя вести, обратитесь к его определению. Для протоколов, широко используемых в Интернете, это обычно один или несколько RFC.

В таком случае, RFC 8422 совершенно четко описывает, что должно произойти в этом сценарии: сервер не должен пытаться использовать сертификат ECC, если клиент не поддерживает эллиптические кривые, используемые в этом сертификате.

В разделе 5.1 объясняется, что сервер не должен пытаться согласовать ECC, если согласование завершится неудачно:

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

ПРИМЕЧАНИЕ. Сервер, участвующий в обмене ключами ECDHE_ECDSA, может использовать разные кривые для ключа ECDSA или EdDSA в своем сертификате и для эфемерного ключа ECDH в сообщении ServerKeyExchange. Сервер ДОЛЖЕН учитывать расширения в обоих случаях.

Если сервер не понимает расширение поддерживаемых эллиптических кривых, не понимает расширение поддерживаемых форматов точек или не может выполнить квитирование ECC, ограничивая себя перечисленными кривыми и форматами точек, он НЕ ДОЛЖЕН согласовывать использование шифра ECC. люкс. В зависимости от того, какие другие комплекты шифров предлагаются клиентом и поддерживаются сервером, это может привести к фатальному предупреждению об ошибке установления связи из-за отсутствия общих комплектов шифров.

В разделе 5.3 также говорится:

Сервер создает соответствующую цепочку сертификатов и передает ее клиенту в сообщении сертификата. Если клиент использовал расширение Supported Elliptic Curves Extension, открытый ключ в сертификате сервера ДОЛЖЕН соответствовать выбору клиента эллиптических кривых. Сервер, который не может удовлетворить это требование, НЕ ДОЛЖЕН выбирать набор шифров ECC в своем сообщении ServerHello.

Похоже, вы все-таки отправляете отчет об ошибке в CloudFlare.

Это вполне может быть ошибка в mBedTLS это заставляет его рекламировать функции / алгоритмы, которые он фактически не поддерживает в встроенной конфигурации. И это сбивает сервер с толку.

Делать небольшой автономный пример программы который демонстрирует это поведение и сообщить об этом mBedTLS Разработчики. Либо они скажут вам, что это ошибка CloudFlare, либо исправят ошибку в своей библиотеке.

Так как CloudFlare обслуживает миллионы пользователей каждый день, неисправная конфигурация обнаруживается очень быстро. С другой стороны mBedTLS - это библиотека для очень специфического использования, которая не подвергается такому же вниманию. Если бы я мог, я бы поставил на то, что здесь ошибается mBedTLS, а не CloudFlare.