У меня есть встроенное устройство, использующее 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.