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
El servidor solo admite TLS 1.0 o 1.1
frecuenteEl ClientHello de un cliente moderno solo ofrece TLS 1.2 y 1.3. Un servidor cuya versión más alta es 1.0 o 1.1, y que entiende la extensión supported_versions, no tiene nada que elegir y rechaza la conexión con protocol_version.
El cliente tiene configurado un máximo antiguo
ocasional--tls-max 1.1, --tlsv1.0 con un límite o una línea de .curlrc olvidada tras depurar un dispositivo antiguo hacen que curl ofrezca versiones que un servidor actual tiene desactivadas.
Un servidor solo con TLS 1.3 frente a un cliente limitado a 1.2
ocasionalAlgunos endpoints reforzados solo aceptan TLS 1.3. A los clientes compilados con bibliotecas antiguas, o forzados a TLS 1.2 por configuración, el servidor los rechaza con la misma alerta.
Cómo solucionarlo
- 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.
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.
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
SSL routines:ssl3_read_bytes:tlsv1 alert protocol versionOpenSSL (client side)curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocolcurl (OpenSSL backend)curl: (35) TLS connect error: error:0A000410:SSL routines::ssl/tls alert handsh…curl (OpenSSL backend)SSL_ERROR_UNSUPPORTED_VERSIONFirefox