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
O servidor só oferece suporte a TLS 1.0 ou 1.1
comumO ClientHello de um cliente moderno oferece apenas TLS 1.2 e 1.3. Um servidor cuja versão mais alta é 1.0 ou 1.1, e que entende a extensão supported_versions, não tem o que escolher e recusa com protocol_version.
O cliente foi instruído a usar uma versão máxima antiga
ocasional--tls-max 1.1, --tlsv1.0 com limite ou uma linha no .curlrc que sobrou da depuração de um dispositivo antigo fazem o curl oferecer versões que um servidor atual desativou.
Um servidor só com TLS 1.3 encontra um cliente limitado ao 1.2
ocasionalAlguns endpoints com configuração reforçada aceitam apenas TLS 1.3. Clientes compilados com bibliotecas antigas, ou forçados ao TLS 1.2 pela configuração, são recusados com o mesmo alerta.
Como corrigir
- 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.
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.
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
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