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

Mensagem de erro

curl: (35) TLS connect error: error:0A00010B:SSL routines::wrong version number

Também aparece como

  • curl: (35) error:0A00010B:SSL routines::wrong version number
  • curl: (35) error:1408F10B:SSL routines:ssl3_get_record:wrong version number

Versões recentes do curl (aqui, 8.14.1) colocam “TLS connect error: ” antes do motivo informado pelo OpenSSL; o curl 7.x imprimia só o motivo. Builds do OpenSSL 1.1.1 imprimem a forma longa “error:1408F10B:SSL routines:ssl3_get_record:wrong version number”; o OpenSSL 3.x imprime “error:0A00010B:SSL routines::wrong version number”.

curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_WRONG_VERSION_NUMBER

O que significa

O curl enviou um ClientHello TLS, e os primeiros bytes que voltaram não eram um registro TLS. O OpenSSL lê o campo de versão do cabeçalho do registro nessa resposta e encontra lixo, normalmente as letras de “HTTP/1.1 400” vindas de um servidor HTTP não criptografado. Apesar da mensagem, quase nunca se trata de versões de TLS: o outro lado não está falando TLS nessa porta.

Por que acontece

Como corrigir

  1. 1.

    Verificar qual protocolo a porta realmente usa

    Faça uma requisição para a mesma porta com http://. Se receber uma resposta HTTP, use http:// ou a porta TLS real; o openssl s_client confirma quais portas completam um handshake TLS.

    bash
    # What does the port speak? An HTTP status line means plain HTTP.
    curl -sS -i http://api.example.com:8080/ | head -1        # HTTP/1.1 200 OK  -> not TLS
    openssl s_client -connect api.example.com:8443 -brief </dev/null   # handshake summary -> TLS
  2. 2.

    Usar http:// na URL do proxy

    A menos que seu proxy ofereça suporte explícito a TLS até o proxy, escreva o proxy como http://host:port. A conexão com o destino continua sendo TLS de ponta a ponta pelo túnel CONNECT.

    bash
    # Most corporate proxies accept plain HTTP from the client and tunnel HTTPS with CONNECT
    export HTTPS_PROXY=http://proxy.example.net:3128     # http:// even for HTTPS traffic
    curl -x http://proxy.example.net:3128 https://api.example.com/
  3. 3.

    Usar STARTTLS em portas STARTTLS

    Para protocolos de e-mail, o curl passa para TLS com --ssl-reqd nas portas de submissão e IMAP, ou usa TLS implícito nas portas 465 e 993 com os esquemas smtps:// e imaps://.

    bash
    # Port 587/25 (SMTP) and 143 (IMAP) start in plain text and upgrade with STARTTLS
    curl --ssl-reqd smtp://mail.example.com:587 -v
    # Implicit TLS lives on 465 (SMTPS) and 993 (IMAPS)
    curl smtps://mail.example.com:465 -v
  4. 4.

    Donos do servidor: ativar TLS no listener

    Se os clientes devem usar https:// nessa porta, o listener precisa estar com TLS ativado e um certificado configurado; caso contrário, informe a porta correta.

    text
    # nginx: the port that clients reach with https:// needs the ssl flag
    server {
        listen 443 ssl;
        ssl_certificate     /etc/nginx/tls/fullchain.pem;
        ssl_certificate_key /etc/nginx/tls/privkey.pem;
    }

Erros relacionados

Ver toda a base de erros de assinatura