Mensagem de erro
curl: (35) TLS connect error: error:0A000102:SSL routines::unsupported protocol
Também aparece como
- curl: (35) error:0A000102:SSL routines::unsupported protocol
- curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
Versões recentes do curl (aqui, 8.14.1) colocam “TLS connect error: ” antes do motivo informado pelo OpenSSL. O OpenSSL 1.1.1 indica a função: “error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol”. Quando é o servidor que recusa, o cliente vê “tlsv1 alert protocol version”.
curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_UNSUPPORTED_PROTOCOL
O que significa
O servidor respondeu ao ClientHello escolhendo uma versão do protocolo que a biblioteca TLS do curl não tem permissão para usar, normalmente TLS 1.0 ou 1.1. O cliente então aborta do próprio lado. O caminho de rede e o certificado não importam aqui: as duas pontas simplesmente não têm nenhuma versão de TLS em comum.
Por que acontece
O servidor só oferece suporte a TLS 1.0 ou 1.1
comumInstalações antigas de Windows Server/IIS, aplicações da época do Java 6/7 e balanceadores de carga sem manutenção ainda negociam TLS 1.0. A RFC 8996 tornou o TLS 1.0 e o 1.1 obsoletos em 2021, e os clientes atuais não os oferecem mais.
A política do sistema do cliente define o TLS 1.2 como mínimo
comumAs políticas de criptografia do Debian, do Ubuntu (desde o 20.04) e do RHEL 8+ e o nível de segurança padrão do OpenSSL 3 rejeitam TLS 1.0/1.1. O mesmo servidor ainda pode funcionar a partir de uma máquina mais antiga, o que faz a falha parecer específica do ambiente.
Interfaces de gerenciamento embarcadas e dispositivos
ocasionalInterfaces web de impressoras e nobreaks, firmware antigo de IPMI/iLO, gateways SCADA e dispositivos semelhantes muitas vezes não podem ser atualizados para além do TLS 1.0.
Como corrigir
- 1.
Confirmar quais versões o servidor aceita
Teste cada versão explicitamente. Se só tls1 ou tls1_1 funcionarem, o servidor precisa ser atualizado; se tls1_2 também funcionar, procure uma opção do cliente que limite a versão 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.
Ativar TLS 1.2 e 1.3 no servidor
Ative o TLS 1.2 (e o 1.3, onde a pilha oferecer suporte) e desative o 1.0/1.1. Essa é a única correção que também ajuda navegadores, aplicativos móveis e outros clientes de 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.
Último recurso: permitir TLS 1.0 em uma chamada para um dispositivo que não pode ser atualizado
Reative a versão antiga só para o comando específico que se comunica com o dispositivo legado, nunca no sistema inteiro. O TLS 1.0 depende de construções com SHA-1 e CBC que têm ataques conhecidos; mantenha esse tráfego em uma rede de gerenciamento isolada.
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/
Erros relacionados
SSL routines:ssl_choose_client_version:unsupported protocolOpenSSL (client side)curl: (35) TLS connect error: error:0A00042E:SSL routines::tlsv1 alert protocol…curl (OpenSSL backend)The server selected protocol version TLS10 is not accepted by client preference…Java (JSSE)tls: server selected unsupported protocol version 301Go crypto/tls clientnet::ERR_SSL_VERSION_OR_CIPHER_MISMATCHChrome, Edge and other Chromium browsers