Mensaje de error
SSL routines:tls_setup_handshake:no protocols available
También se muestra como
- error:0A0000BF:SSL routines::no protocols available
La CLI de openssl (3.0 y 3.5) imprime «error:0A0000BF:SSL routines:tls_setup_handshake:no protocols available»; las aplicaciones que formatean los errores sin el nombre de la función muestran «error:0A0000BF:SSL routines::no protocols available».
OpenSSL (client or server side) — SSL_R_NO_PROTOCOLS_AVAILABLE before the handshake starts
Qué significa
OpenSSL se negó incluso a iniciar el handshake porque, después de aplicar todas las restricciones, no queda ninguna versión de protocolo que ofrecer. Normalmente, la aplicación pidió TLS 1.0 o 1.1 mientras el nivel de seguridad de OpenSSL (2 de forma predeterminada en las distribuciones actuales) prohíbe esas versiones, o la versión mínima configurada es superior a la máxima. No se envió nada al servidor.
Por qué ocurre
Se fuerza TLS 1.0/1.1 mientras el nivel de seguridad lo prohíbe
frecuenteDesde OpenSSL 3.0, los niveles de seguridad 1 y superiores desactivan TLS 1.0 y 1.1; las distribuciones usan el nivel 2 de forma predeterminada. Por eso, un cliente con TLS 1.0 fijado en el código para un dispositivo antiguo no tiene nada que ofrecer.
Versión mínima superior a la máxima
ocasionalLas configuraciones que combinan un mínimo de TLS 1.3 con un máximo de TLS 1.2 (a menudo procedentes de dos ajustes distintos superpuestos) dejan un rango vacío.
Una política criptográfica de todo el sistema prevalece sobre la aplicación
ocasionalLas políticas criptográficas de RHEL y Fedora (DEFAULT, FUTURE) y el openssl.cnf de Debian establecen MinProtocol y el nivel de seguridad para todas las aplicaciones OpenSSL de la máquina.
Cómo solucionarlo
- 1.
Encontrar la configuración que impone la restricción
Busca en openssl.cnf y en la política criptográfica del sistema los valores de MinProtocol, MaxProtocol y CipherString @SECLEVEL.
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 antiguo: bajar el nivel para un solo comando
Añadir @SECLEVEL=0 a la cadena de cifrados vuelve a activar TLS 1.0/1.1 solo para esa ejecución. Mantén estas excepciones fuera de la configuración de todo el sistema y lejos de redes que no son de confianza.
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 un rango de versiones coherente
Asegúrate de que el mínimo no supera el máximo; de TLS 1.2 a TLS 1.3 es el rango habitual hoy en día.
ini # openssl.cnf (system_default_sect): a consistent range MinProtocol = TLSv1.2 MaxProtocol = TLSv1.3