Saltar al contenido
ecdsa.com
curl (OpenSSL backend)curl

Mensaje de error

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

También se muestra como

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

Las versiones recientes de curl (aquí, 8.14.1) anteponen «TLS connect error: » al motivo de OpenSSL; curl 7.x imprimía solo el motivo. Las compilaciones con OpenSSL 1.1.1 imprimen la forma larga «error:1408F10B:SSL routines:ssl3_get_record:wrong version number»; OpenSSL 3.x imprime «error:0A00010B:SSL routines::wrong version number».

curl (OpenSSL backend) — CURLE_SSL_CONNECT_ERROR, SSL_R_WRONG_VERSION_NUMBER

Qué significa

curl envía un ClientHello TLS y los primeros bytes que recibe de vuelta no son un registro TLS. OpenSSL lee el campo de versión del encabezado del registro en esa respuesta y encuentra basura, normalmente las letras de «HTTP/1.1 400» de un servidor HTTP sin cifrar. Pese al texto del error, casi nunca se trata de versiones de TLS: el otro extremo no habla TLS en ese puerto.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Comprobar qué protocolo habla realmente el puerto

    Solicita el mismo puerto con http://. Si recibes una respuesta HTTP, usa http:// o el verdadero puerto TLS; openssl s_client confirma qué puertos completan un 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:// en la URL del proxy

    Salvo que tu proxy admita explícitamente TLS hasta el propio proxy, escribe el proxy como http://host:port. La conexión con el destino sigue siendo TLS de extremo a extremo a través del 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 en los puertos STARTTLS

    En los protocolos de correo, curl actualiza la conexión con --ssl-reqd en los puertos de envío (submission) e IMAP, o usa TLS implícito en 465 y 993 con los 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.

    Propietarios del servidor: habilitar TLS en el agente de escucha

    Si los clientes deben usar https:// en este puerto, el agente de escucha necesita TLS activado y un certificado configurado; si no, publica el puerto correcto.

    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;
    }

Errores relacionados

Explorar toda la base de datos de errores de firma