Fehlermeldung
SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Auch ausgegeben als
- Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Die umgebende Kette lautet „The SSL connection could not be established“ → „Authentication failed, see inner exception.“ → diese Meldung → der Grund von OpenSSL (zum Beispiel „error:0A000410:SSL routines::sslv3 alert handshake failure“ mit OpenSSL 3.0, „ssl/tls alert handshake failure“ mit 3.3+). Unter Windows (Schannel) und macOS (TLS-Stack von Apple) meldet .NET solche Fehler stattdessen mit plattformspezifischen Meldungen.
.NET on Linux (SslStream over OpenSSL) — inner exception carrying the OpenSSL reason
Was der Fehler bedeutet
Unter Linux läuft SslStream von .NET auf dem OpenSSL des Systems, und der Handshake ist innerhalb von OpenSSL mit SSL_ERROR_SSL fehlgeschlagen. Diese Zeile ist nur eine Hülle; die nächste innere Exception (Interop+Crypto+OpenSslCryptographicException) enthält den eigentlichen Grund von OpenSSL, etwa einen Alert vom Server oder eine abgelehnte Protokollversion.
Warum der Fehler auftritt
Keine gemeinsame Cipher Suite oder Protokollversion
häufigAlte Server mit RSA-Schlüsselaustausch, 3DES oder ausschließlich TLS 1.0/1.1; der Grund von OpenSSL zeigt den Alert, den der Server gesendet hat.
Der Server hat ein Client-Zertifikat verlangt
gelegentlichServer mit Mutual TLS beantworten unter TLS 1.2 ein fehlendes Zertifikat mit dem Alert handshake_failure.
Die OpenSSL-Richtlinie des Systems verbietet, was der Server braucht
gelegentlichStandardvorgaben der Distribution (Sicherheitsniveau 2, mindestens TLS 1.2) gelten auch für .NET unter Linux; dieselbe App kann unter Windows funktionieren und in einem Linux-Container scheitern.
So behebst du den Fehler
- 1.
Grund von OpenSSL in der innersten Exception lesen
Der Fehlercode error:0A… und sein Text benennen das Problem; ordne ihn wie gezeigt zu.
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.
Fähigkeiten von Server und Client vergleichen
Liste die Cipher Suites des Servers und die lokalen OpenSSL-Standardwerte auf.
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.
Server korrigieren, nicht die Richtlinie des Clients
Modernisiere die TLS-Konfiguration des Servers; lockere die OpenSSL-Richtlinie des Clients nur als eng begrenzte, vorübergehende Ausnahme.
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.