Message d’erreur
SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Également affiché sous la forme
- Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
La chaîne d’exceptions se lit ainsi : « The SSL connection could not be established » → « Authentication failed, see inner exception. » → ce message → la raison donnée par OpenSSL (par exemple « error:0A000410:SSL routines::sslv3 alert handshake failure » avec OpenSSL 3.0, « ssl/tls alert handshake failure » avec 3.3 et versions ultérieures). Sous Windows (Schannel) et macOS (pile TLS d’Apple), .NET signale plutôt ces échecs par des messages propres à chaque plateforme.
.NET on Linux (SslStream over OpenSSL) — inner exception carrying the OpenSSL reason
Ce que cela signifie
Sous Linux, le SslStream de .NET repose sur l’OpenSSL du système, et le handshake a échoué dans OpenSSL avec l’erreur SSL_ERROR_SSL. Cette ligne n’est qu’une enveloppe ; l’exception interne suivante (Interop+Crypto+OpenSslCryptographicException) contient la véritable raison donnée par OpenSSL, comme une alerte envoyée par le serveur ou une version du protocole refusée.
Pourquoi cela se produit
Aucune suite de chiffrement ni version du protocole en commun
fréquenteDes serveurs anciens limités à l’échange de clés RSA, à 3DES ou à TLS 1.0/1.1 ; la raison donnée par OpenSSL indique l’alerte envoyée par le serveur.
Le serveur exigeait un certificat client
occasionnelleEn TLS 1.2, les serveurs en TLS mutuel répondent à l’absence de certificat par une alerte handshake_failure.
La politique OpenSSL du système interdit ce dont le serveur a besoin
occasionnelleLes paramètres par défaut de la distribution (niveau de sécurité 2, TLS 1.2 au minimum) s’appliquent aussi à .NET sous Linux ; la même application peut fonctionner sous Windows et échouer dans un conteneur Linux.
Comment corriger l’erreur
- 1.
Lire la raison OpenSSL dans l’exception la plus interne
Le code d’erreur error:0A… et son texte identifient le problème ; associez-le à sa cause comme indiqué.
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.
Comparer les capacités du serveur et du client
Énumérez les suites du serveur et les paramètres OpenSSL locaux par défaut.
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.
Corriger le serveur, pas la politique du client
Modernisez la configuration TLS du serveur ; n’assouplissez la politique OpenSSL du client qu’à titre d’exception ciblée et temporaire.
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.