Mensaje de error
SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
También se muestra como
- Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
La cadena de excepciones que la rodea dice «The SSL connection could not be established» → «Authentication failed, see inner exception.» → este mensaje → el motivo de OpenSSL (por ejemplo, «error:0A000410:SSL routines::sslv3 alert handshake failure» con OpenSSL 3.0, «ssl/tls alert handshake failure» con 3.3+). En Windows (Schannel) y macOS (la pila TLS de Apple), .NET notifica estos fallos con mensajes propios de cada plataforma.
.NET on Linux (SslStream over OpenSSL) — inner exception carrying the OpenSSL reason
Qué significa
En Linux, el SslStream de .NET funciona sobre el OpenSSL del sistema, y el handshake falló dentro de OpenSSL con SSL_ERROR_SSL. Esta línea es solo un envoltorio; la siguiente excepción interna (Interop+Crypto+OpenSslCryptographicException) contiene el motivo real de OpenSSL, como una alerta del servidor o una versión del protocolo rechazada.
Por qué ocurre
Ningún conjunto de cifrado ni versión del protocolo en común
frecuenteServidores heredados que solo admiten intercambio de claves RSA, 3DES o TLS 1.0/1.1; el motivo de OpenSSL muestra la alerta que envió el servidor.
El servidor exigía un certificado de cliente
ocasionalLos servidores TLS 1.2 con TLS mutuo responden a la falta de certificado con una alerta handshake_failure.
La política de OpenSSL del sistema prohíbe lo que necesita el servidor
ocasionalLos valores predeterminados de la distribución (nivel de seguridad 2, TLS 1.2 como mínimo) también se aplican a .NET en Linux; la misma aplicación puede funcionar en Windows y fallar en un contenedor Linux.
Cómo solucionarlo
- 1.
Leer el motivo de OpenSSL en la excepción más interna
El código error:0A… y su texto identifican el problema; interprétalo como se muestra.
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.
Comparar las capacidades del servidor y del cliente
Enumera los conjuntos de cifrado del servidor y los valores predeterminados del OpenSSL local.
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.
Corregir el servidor, no la política del cliente
Moderniza la configuración TLS del servidor; relaja la política de OpenSSL del cliente solo como una excepción acotada y temporal.
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.