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

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

Como corrigir

  1. 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. 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. 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

Ver toda a base de erros de assinatura