Saltar al contenido
ecdsa.com
curl (OpenSSL backend)curl

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

Cómo solucionarlo

  1. 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. 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. 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

Explorar toda la base de datos de errores de firma