Сообщение об ошибке
SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Также выводится как
- Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Цепочка целиком выглядит так: «The SSL connection could not be established» → «Authentication failed, see inner exception.» → это сообщение → причина от OpenSSL (например, «error:0A000410:SSL routines::sslv3 alert handshake failure» в OpenSSL 3.0, «ssl/tls alert handshake failure» в 3.3 и новее). В Windows (Schannel) и macOS (TLS-стек Apple) .NET сообщает о таких сбоях другими сообщениями, своими для каждой платформы.
.NET on Linux (SslStream over OpenSSL) — inner exception carrying the OpenSSL reason
Что это означает
В Linux SslStream в .NET работает поверх системного OpenSSL, и рукопожатие завершилось ошибкой внутри OpenSSL с кодом SSL_ERROR_SSL. Эта строка — лишь обёртка: настоящую причину от OpenSSL, например оповещение от сервера или отклонённую версию протокола, содержит следующее внутреннее исключение (Interop+Crypto+OpenSslCryptographicException).
Почему это происходит
Нет общего набора шифров или версии протокола
частоУстаревшие серверы, поддерживающие только обмен ключами RSA, 3DES или TLS 1.0/1.1; причина от OpenSSL показывает, какое оповещение отправил сервер.
Сервер потребовал клиентский сертификат
иногдаСерверы TLS 1.2 со взаимной TLS-аутентификацией отвечают на отсутствие сертификата оповещением handshake_failure.
Системная политика OpenSSL запрещает то, что нужно серверу
иногдаНастройки дистрибутива по умолчанию (уровень безопасности 2, минимум TLS 1.2) действуют и на .NET в Linux; одно и то же приложение может работать в Windows и завершаться ошибкой в Linux-контейнере.
Как исправить
- 1.
Прочитайте причину от OpenSSL в самом внутреннем исключении
Код ошибки error:0A… и её текст указывают на проблему; сопоставьте их с причиной, как показано ниже.
text Interop+Crypto+OpenSslCryptographicException: error:0A000410:SSL routines::sslv3 alert handshake failure -> the server rejected the offered suites/versions (or wants a client certificate) error:0A00042E:SSL routines::tlsv1 alert protocol version -> the server only speaks TLS 1.0/1.1 error:0A00018A:SSL routines::dh key too small -> the server uses 1024-bit DH - 2.
Сравните возможности сервера и клиента
Перечислите наборы шифров сервера и настройки локального OpenSSL по умолчанию.
bash nmap --script ssl-enum-ciphers -p 443 legacy.example.com # what the server offers openssl ciphers -v 'DEFAULT' | head # what this system's OpenSSL offers - 3.
Исправляйте сервер, а не политику клиента
Обновите TLS-конфигурацию сервера; ослабляйте политику OpenSSL на клиенте только как узкое временное исключение.
text Server side: enable TLS 1.2/1.3 with ECDHE + AES-GCM (or ChaCha20) suites. Lowering the system-wide OpenSSL policy (CipherString=DEFAULT@SECLEVEL=1 in openssl.cnf) affects every application on the host and should only be a short-lived exception for an isolated legacy peer.