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
Мобильная версия