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
https:// en un puerto que sirve HTTP sin cifrar
frecuenteLos servidores de desarrollo en 8080 o 3000, un backend detrás de un balanceador de carga o una directiva listen mal configurada responden con HTTP. Intercambiar http y https en la URL, o usar el número del puerto TLS con http://, es el origen más habitual de este mensaje.
La URL del proxy dice https://, pero el proxy habla HTTP
frecuenteHTTPS_PROXY=https://proxy:3128 hace que curl inicie TLS con el propio proxy. La mayoría de los proxies de reenvío esperan HTTP sin cifrar del cliente y abren un túnel CONNECT cifrado hasta el destino, así que la URL del proxy debería empezar por http:// incluso para tráfico HTTPS.
TLS implícito contra un puerto STARTTLS
ocasionalSMTP en 25/587, IMAP en 143, POP3 en 110, LDAP en 389 y PostgreSQL/MySQL saludan en texto sin cifrar y actualizan la conexión más tarde. Empezar allí con un handshake TLS falla de inmediato.
Un portal cautivo o un filtro responde en lugar del servidor
ocasionalLas redes Wi-Fi de hoteles y aeropuertos, los filtros parentales y algunos firewalls interceptan el puerto 443 y responden con una página de redirección HTTP antes de que se produzca ningún intercambio TLS.
Cómo solucionarlo
- 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.
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.
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.
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
SSL routines:tls_validate_record_header:wrong version numberOpenSSL 3 (openssl s_client and any OpenSSL-based client)code: 'ERR_SSL_WRONG_VERSION_NUMBER'Node.js tls.connect / fetch (undici)[SSL: WRONG_VERSION_NUMBER] wrong version numberPython ssl module (OpenSSL)http: server gave HTTP response to HTTPS clientGo net/httpjavax.net.ssl.SSLException: Unsupported or unrecognized SSL messageJava (JSSE)