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

Mensaje de error

curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol version

También se muestra como

  • curl: (35) error:0A00042E:SSL routines::tlsv1 alert protocol version
  • curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version

Las versiones recientes de curl anteponen «TLS connect error: » al motivo de OpenSSL. OpenSSL 1.1.1 incluye la función: «error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version». Si, en cambio, el servidor elige una versión que el cliente rechaza, el cliente informa «unsupported protocol».

curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, TLS alert 70 (protocol_version) received from the server

Qué significa

El servidor envía la alerta TLS 70 (protocol_version): no acepta ninguna de las versiones de TLS que ofrece curl. El prefijo «tlsv1» es solo el nombre que OpenSSL da a las alertas definidas desde TLS 1.0, no la versión en uso. Normalmente el servidor está anclado en TLS 1.0/1.1 mientras el cliente ofrece 1.2 y 1.3, o el cliente se ha limitado a versiones por debajo del mínimo del servidor.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Averiguar qué versiones acepta el servidor

    Prueba cada versión con openssl s_client. El resultado te indica si hay que corregir el servidor (solo acepta tls1/tls1_1) o el cliente (nunca ofreció la versión aceptada).

    bash
    for v in tls1 tls1_1 tls1_2 tls1_3; do
      printf '%s: ' "$v"
      openssl s_client -connect api.example.com:443 -servername api.example.com -"$v" </dev/null >/dev/null 2>&1 \
        && echo accepted || echo refused
    done
  2. 2.

    Habilitar TLS 1.2 y 1.3 en el servidor

    Actualiza la configuración TLS (y, si hace falta, la biblioteca TLS o el sistema operativo) para que el servidor acepte TLS 1.2 y 1.3.

    text
    # nginx
    ssl_protocols TLSv1.2 TLSv1.3;
    # HAProxy (global section)
    ssl-default-bind-options ssl-min-ver TLSv1.2
  3. 3.

    Quitar los límites de versión en el cliente

    Elimina --tls-max y las opciones de protocolo antiguas de los scripts y de .curlrc; establece solo un mínimo, para que curl pueda negociar la versión más alta que admitan ambos lados.

    bash
    grep -nE 'tls-max|tlsv1|sslv3' ~/.curlrc   # a forgotten cap in the config file
    curl --tlsv1.2 https://api.example.com/        # minimum 1.2, no maximum

Errores relacionados

Explorar toda la base de datos de errores de firma