Pular para o conteúdo
ecdsa.com
curl (OpenSSL backend)curl

Mensagem de erro

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

Também aparece como

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

Versões recentes do curl colocam “TLS connect error: ” antes do motivo informado pelo OpenSSL. O OpenSSL 1.1.1 inclui a função: “error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version”. Se, em vez disso, o servidor escolher uma versão que o cliente recusa, o cliente informa “unsupported protocol”.

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

O que significa

O servidor enviou o alerta TLS 70 (protocol_version): nenhuma das versões de TLS que o curl ofereceu é aceitável para ele. O prefixo “tlsv1” é só o nome que o OpenSSL dá aos alertas definidos desde o TLS 1.0, não a versão em uso. Normalmente o servidor está preso ao TLS 1.0/1.1 enquanto o cliente oferece 1.2 e 1.3, ou um cliente foi limitado abaixo do mínimo do servidor.

Por que acontece

Como corrigir

  1. 1.

    Descobrir quais versões o servidor aceita

    Teste cada versão com o openssl s_client. O resultado indica se é preciso corrigir o servidor (só tls1/tls1_1 aceitos) ou o cliente (ele nunca ofereceu a versão aceita).

    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.

    Ativar TLS 1.2 e 1.3 no servidor

    Atualize a configuração TLS (e, se necessário, a biblioteca TLS ou o sistema operacional) para que o servidor aceite TLS 1.2 e 1.3.

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

    Remover limites de versão no cliente

    Exclua --tls-max e opções de protocolo antigas dos scripts e do .curlrc; defina só um mínimo, para que o curl possa negociar a versão mais alta que os dois lados aceitam.

    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

Erros relacionados

Ver toda a base de erros de assinatura