Mensaje de error
received corrupt message of type InvalidContentType
reqwest lo muestra al final de «error sending request for url (…): client error (Connect): received corrupt message of type InvalidContentType»; ureq, como «io: received corrupt message of type InvalidContentType». Ante la misma situación, los clientes basados en OpenSSL muestran «wrong version number».
rustls (via reqwest, ureq, tonic) — rustls::Error::InvalidMessage(InvalidContentType): the peer's reply is not TLS
Qué significa
rustls leyó el primer byte de la respuesta del servidor como el tipo de contenido de un registro TLS y encontró un valor que ningún registro TLS puede tener. El otro extremo no habla TLS: normalmente es un servidor HTTP que responde «HTTP/1.1 …» en un puerto al que se accedió con https://, un servidor gRPC en texto plano o un proxy que espera HTTP sin cifrar.
Por qué ocurre
https:// a un puerto de HTTP sin cifrar
frecuenteServidores de desarrollo locales, sidecars o puertos internos sin TLS.
Un proxy sin TLS al que se accede con TLS
ocasionalHTTPS_PROXY apunta a una URL https:// de un proxy que con los clientes solo habla HTTP sin cifrar.
Un cliente gRPC con TLS contra un servidor en texto plano
ocasionalCanales de tonic creados a partir de endpoints https:// (o con configuración TLS) contra servidores iniciados sin TLS.
Cómo solucionarlo
- 1.
Averiguar qué protocolo habla el puerto
Si responde HTTP sin cifrar, usa http:// o el puerto TLS del servidor.
bash curl -si http://127.0.0.1:8080/ | head -1 # plain HTTP answers -> use http:// or the TLS port - 2.
Ajustar el esquema del endpoint al servidor
Usa endpoints http:// para los servidores gRPC en texto plano de redes de confianza y, en los demás casos, https:// con configuración TLS.
rust // tonic: use an http:// endpoint for plaintext servers, https:// + TLS config for TLS servers let channel = tonic::transport::Channel::from_static("http://127.0.0.1:50051").connect().await?;