Mensaje de error
curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocol
También se muestra como
- curl: (35) error:0A000102:SSL routines::unsupported protocol
- curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
Las versiones recientes de curl (aquí, 8.14.1) anteponen «TLS connect error: » al motivo de OpenSSL. OpenSSL 1.1.1 nombra la función: «error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol». Cuando es el servidor quien rechaza, el cliente ve en su lugar «tlsv1 alert protocol version».
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_UNSUPPORTED_PROTOCOL
Qué significa
El servidor responde al ClientHello eligiendo una versión de protocolo que la biblioteca TLS de curl no tiene permitido usar, normalmente TLS 1.0 o 1.1. Después, el cliente aborta por su cuenta. La ruta de red y el certificado no influyen aquí: los dos extremos simplemente no tienen ninguna versión de TLS en común.
Por qué ocurre
El servidor solo admite TLS 1.0 o 1.1
frecuenteLas instalaciones antiguas de Windows Server/IIS, las aplicaciones de la época de Java 6/7 y los balanceadores de carga sin mantenimiento siguen negociando TLS 1.0. El RFC 8996 declaró obsoletos TLS 1.0 y 1.1 en 2021, y los clientes actuales ya no los ofrecen.
La política del sistema del cliente fija un mínimo de TLS 1.2
frecuenteLas políticas criptográficas de Debian, Ubuntu (desde 20.04) y RHEL 8+ y el nivel de seguridad predeterminado de OpenSSL 3 rechazan TLS 1.0/1.1. El mismo servidor puede seguir funcionando desde un equipo más antiguo, lo que hace que el fallo parezca depender del entorno.
Interfaces de gestión integradas y dispositivos
ocasionalLas interfaces web de impresoras y UPS, el firmware antiguo de IPMI/iLO, las pasarelas SCADA y dispositivos similares a menudo no se pueden actualizar más allá de TLS 1.0.
Cómo solucionarlo
- 1.
Confirmar qué versiones acepta el servidor
Prueba cada versión de forma explícita. Si solo funcionan tls1 o tls1_1, hay que actualizar el servidor; si también funciona tls1_2, busca una opción del cliente que limite la versión máxima.
bash # Which versions does the server accept? (each line succeeds or fails on its own) for v in tls1 tls1_1 tls1_2 tls1_3; do printf '%s: ' "$v" openssl s_client -connect legacy.example.com:443 -"$v" </dev/null >/dev/null 2>&1 && echo ok || echo no done - 2.
Habilitar TLS 1.2 y 1.3 en el servidor
Activa TLS 1.2 (y 1.3 donde la pila lo admita) y desactiva 1.0/1.1. Es la única solución que también ayuda a los navegadores, las aplicaciones móviles y otros clientes de la API.
text # nginx ssl_protocols TLSv1.2 TLSv1.3; # Apache httpd SSLProtocol -all +TLSv1.2 +TLSv1.3 # IIS / Windows Server: enable TLS 1.2 under # HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server - 3.
Último recurso: permitir TLS 1.0 para una llamada a un dispositivo que no puedes actualizar
Vuelve a habilitar la versión antigua solo para el comando concreto que se comunica con el dispositivo antiguo, nunca en todo el sistema. TLS 1.0 depende de SHA-1 y de construcciones CBC con ataques conocidos; mantén ese tráfico en una red de gestión aislada.
bash # Last resort for a device you cannot upgrade: allow TLS 1.0 for this one call only. # OpenSSL 3 also needs security level 0 for the SHA-1 based handshake of TLS 1.0/1.1. curl --tlsv1.0 --ciphers 'DEFAULT:@SECLEVEL=0' https://legacy-device.example.internal/
Errores relacionados
SSL routines:ssl_choose_client_version:unsupported protocolOpenSSL (client side)curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol…curl (OpenSSL backend)The server selected protocol version TLS10 is not accepted by client preference…Java (JSSE)tls: server selected unsupported protocol version 301Go crypto/tls clientnet::ERR_SSL_VERSION_OR_CIPHER_MISMATCHChrome, Edge and other Chromium browsers