Mensagem de erro
SSL routines:tls_setup_handshake:no protocols available
Também aparece como
- error:0A0000BF:SSL routines::no protocols available
A CLI do openssl (3.0 e 3.5) imprime “error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available”; aplicações que formatam os erros sem o nome da função mostram “error:0A0000BF:SSL routines::no protocols available”.
OpenSSL (client or server side) — SSL_R_NO_PROTOCOLS_AVAILABLE before the handshake starts
O que significa
O OpenSSL se recusou até mesmo a iniciar o handshake porque, depois de aplicadas todas as restrições, não sobrou nenhuma versão do protocolo para oferecer. Normalmente a aplicação pediu TLS 1.0 ou 1.1 enquanto o nível de segurança do OpenSSL (2 por padrão nas distribuições atuais) os proíbe, ou a versão mínima configurada está acima da máxima. Nada foi enviado ao servidor.
Por que acontece
TLS 1.0/1.1 forçados, mas proibidos pelo nível de segurança
comumDesde o OpenSSL 3.0, o nível de segurança 1 e os superiores desativam o TLS 1.0 e o 1.1; as distribuições usam o nível 2 por padrão. Por isso, um cliente com TLS 1.0 fixo no código para falar com um dispositivo legado não tem nada a oferecer.
Versão mínima acima da máxima
ocasionalConfigurações que combinam um mínimo de TLS 1.3 com um máximo de TLS 1.2 (muitas vezes resultado de duas configurações diferentes sobrepostas) deixam um intervalo vazio.
Uma política criptográfica de todo o sistema prevalece sobre a aplicação
ocasionalAs políticas criptográficas do RHEL e do Fedora (DEFAULT, FUTURE) e o openssl.cnf do Debian definem MinProtocol e o nível de segurança para todas as aplicações OpenSSL da máquina.
Como corrigir
- 1.
Encontrar a configuração que impõe a restrição
Procure no openssl.cnf e na política criptográfica do sistema os valores de MinProtocol, MaxProtocol e @SECLEVEL em CipherString.
bash openssl version -d # where openssl.cnf lives grep -nE 'MinProtocol|MaxProtocol|CipherString' /usr/lib/ssl/openssl.cnf /etc/ssl/openssl.cnf 2>/dev/null update-crypto-policies --show 2>/dev/null # RHEL/Fedora system policy - 2.
Dispositivo legado: reduzir o nível para um único comando
Acrescentar @SECLEVEL=0 à string de cifras reativa o TLS 1.0/1.1 apenas nessa execução. Mantenha essas exceções fora da configuração de todo o sistema e longe de redes não confiáveis.
bash # For a one-off test against a legacy device: lower the security level for this command only echo | openssl s_client -connect legacy.example.com:443 -tls1 -cipher 'DEFAULT:@SECLEVEL=0' - 3.
Usar um intervalo de versões consistente
Garanta que o mínimo não ultrapasse o máximo; o intervalo habitual hoje vai do TLS 1.2 ao TLS 1.3.
ini # openssl.cnf (system_default_sect): a consistent range MinProtocol = TLSv1.2 MaxProtocol = TLSv1.3