Mensaje de error
SSL routines:ssl_choose_client_version:unsupported protocol
También se muestra como
- error:0A000102:SSL routines::unsupported protocol
La CLI de openssl imprime «<thread>:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:<source>»; curl, Node.js y otras aplicaciones muestran «error:0A000102:SSL routines::unsupported protocol». OpenSSL 1.1.1 usaba el código 1425F102.
OpenSSL (client side) — SSL_R_UNSUPPORTED_PROTOCOL: the server chose a version the client does not allow
Qué significa
El cliente ofreció TLS 1.2 y 1.3, pero el ServerHello del servidor eligió una versión más antigua (normalmente TLS 1.0), que el OpenSSL del cliente no tiene permitido usar. El cliente aborta en ssl_choose_client_version. Las pilas TLS antiguas ignoran el rango que ofrece el cliente y simplemente responden con su propia versión; las pilas modernas, en cambio, rechazarían la conexión con una alerta protocol_version.
Por qué ocurre
El servidor solo habla TLS 1.0 o 1.1
frecuenteServidores sin mantenimiento, equipos dedicados antiguos y dispositivos integrados.
El OpenSSL del cliente prohíbe las versiones antiguas
frecuenteLas distribuciones actuales fijan TLS 1.2 como mínimo (nivel de seguridad 2), así que un servidor que funcionaba desde un equipo antiguo falla desde uno nuevo.
Cómo solucionarlo
- 1.
Confirmar la versión del servidor
Forzar TLS 1.0 con el nivel de seguridad 0 solo para este comando de diagnóstico muestra si el servidor habla únicamente la versión antigua.
bash # Allowed only for this diagnostic command: which version does the server pick? echo | openssl s_client -connect legacy.example.com:443 -servername legacy.example.com \ -tls1 -cipher 'DEFAULT:@SECLEVEL=0' -brief 2>&1 | grep -E 'Protocol version|error' - 2.
Habilitar TLS 1.2 y 1.3 en el servidor
Actualizar el servidor (o poner delante un terminador TLS moderno) es la única solución duradera.
text # Server side ssl_protocols TLSv1.2 TLSv1.3; # nginx SSLProtocol -all +TLSv1.2 +TLSv1.3 # Apache httpd