Как устранить исключение Npgsql: «неверная версия протокола» во время установления связи SSL в macOS с .NET 6 и Let's EnC#

Место общения программистов C#
Ответить
Anonymous
 Как устранить исключение Npgsql: «неверная версия протокола» во время установления связи SSL в macOS с .NET 6 и Let's En

Сообщение Anonymous »

Я пытаюсь подключиться к базе данных PostgreSQL 17.5 с моего Mac с помощью .NET 6. Соединение отлично работает с модулями Linux в Kubernetes, но на моем Mac я получаю следующую ошибку:

Npgsql.NpgsqlException (0x80004005): Исключение при выполнении SSL-квитирования ---> Interop+AppleCrypto+SslException: неверная версия протокола.

Этот сертификат является действительным сертификатом Let's Encrypt RSA 2048. Почему это не работает только в macOS?

Основная причина: «идеальный шторм» TLS 1.3 и macOS

Ошибка на самом деле не связана с «плохой версией» протокола. Это ошибка фрагментации рукопожатия, связанная с тем, как .NET 6 взаимодействует с библиотекой Apple SecureTransport (AppleCrypto).
  • Обновление STARTTLS: В отличие от HTTPS (который представляет собой SSL с байта 0), Postgres запускается в виде обычного текста и «обновляется» до SSL.
  • "Толстый" сертификат: Ваша цепочка сертификатов Let's Encrypt RSA большая. В TLS 1.3 сервер отправляет сертификат вместе с «Зашифрованными расширениями».
  • Фрагментация: Поскольку цепочка RSA большая, ответ сервера разбивается на несколько TCP-пакетов (фрагментированных).
  • Ошибка macOS: Linux использует OpenSSL, который безупречно справляется с этой фрагментацией. Однако AppleCrypto в macOS (используется .NET 6) неверно интерпретирует вторую половину фрагментированного пакета TLS 1.3 STARTTLS как новую недопустимую запись. Он паникует и выдает неверную версию протокола.

Что я сделал (исправление DevOps)

Поскольку я не мог изменить клиентский код, я исправил его на уровне инфраструктуры с помощью CloudNativePG (CNPG).
Я заставил сервер PostgreSQL ограничить максимальный протокол на уровне TLS 1.2. При этом обходит ошибочный конечный автомат TLS 1.3 в macOS и используется более старый, более стабильный путь подтверждения TLS 1.2, который правильно обрабатывает фрагментацию RSA.
Исправление в postgresql.conf (или CNPG YAML):
YAML

Код: Выделить всё

postgresql:
parameters:
ssl_min_protocol_version: "TLSv1.2"
ssl_max_protocol_version: "TLSv1.2"

Почему это работает:

  • TLS 1.2 использует другую структуру пакетов, которую macOS .NET 6 понимает даже при фрагментации.
  • Соединение остается зашифрованным и безопасным, но позволяет избежать «передовых» ошибок TLS 1.3, обнаруженных в более старых версиях Реализации .NET/macOS.


Подробнее здесь: https://stackoverflow.com/questions/798 ... ndshake-on
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»