Mensagem de erro
SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
Também aparece como
- Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
A cadeia de exceções em volta é “The SSL connection could not be established” → “Authentication failed, see inner exception.” → esta mensagem → o motivo do OpenSSL (por exemplo, “error:0A000410:SSL routines::sslv3 alert handshake failure” com o OpenSSL 3.0, “ssl/tls alert handshake failure” com o 3.3+). No Windows (Schannel) e no macOS (pilha TLS da Apple), o .NET informa essas falhas com mensagens próprias de cada plataforma.
.NET on Linux (SslStream over OpenSSL) — inner exception carrying the OpenSSL reason
O que significa
No Linux, o SslStream do .NET roda sobre o OpenSSL do sistema, e o handshake falhou dentro do OpenSSL com SSL_ERROR_SSL. Esta linha é só um invólucro; a próxima exceção interna (Interop+Crypto+OpenSslCryptographicException) traz o motivo real do OpenSSL, como um alerta do servidor ou uma versão do protocolo recusada.
Por que acontece
Nenhuma cipher suite ou versão do protocolo em comum
comumServidores legados só com troca de chaves RSA, 3DES ou TLS 1.0/1.1; o motivo do OpenSSL mostra o alerta que o servidor enviou.
O servidor exigiu um certificado de cliente
ocasionalServidores de TLS mútuo com TLS 1.2 respondem a um certificado ausente com um alerta handshake_failure.
A política do OpenSSL do sistema proíbe o que o servidor exige
ocasionalOs padrões da distribuição (nível de segurança 2, TLS 1.2 no mínimo) também valem para o .NET no Linux; o mesmo aplicativo pode funcionar no Windows e falhar em um contêiner Linux.
Como corrigir
- 1.
Ler o motivo do OpenSSL na exceção mais interna
O código error:0A… e o texto identificam o problema; faça a correspondência com a causa como mostrado.
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 os recursos do servidor e do cliente
Enumere as cipher suites do servidor e os padrões do 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.
Corrigir o servidor, não a política do cliente
Modernize a configuração TLS do servidor; afrouxe a política do OpenSSL do cliente apenas como exceção pontual e temporária.
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.