Сообщение об ошибке
received corrupt message of type InvalidContentType
reqwest показывает эту ошибку в конце строки «error sending request for url (…): client error (Connect): received corrupt message of type InvalidContentType», ureq — как «io: received corrupt message of type InvalidContentType». Клиенты на основе OpenSSL выдают в той же ситуации «wrong version number».
rustls (via reqwest, ureq, tonic) — rustls::Error::InvalidMessage(InvalidContentType): the peer's reply is not TLS
Что это означает
rustls прочитал первый байт ответа сервера как тип содержимого записи TLS и нашёл значение, которого не может быть ни у одной записи TLS. Другая сторона не использует TLS: обычно это HTTP-сервер, который отвечает «HTTP/1.1 …» на порту, куда обратились по https://, gRPC-сервер без шифрования или прокси, ожидающий обычный HTTP.
Почему это происходит
https:// на порт с обычным HTTP
частоЛокальные серверы для разработки, sidecar-контейнеры или внутренние порты без TLS.
К обычному прокси обращаются по TLS
иногдаВ HTTPS_PROXY указан URL с https:// для прокси, который общается с клиентами только по обычному HTTP.
Клиент gRPC с TLS обращается к серверу без шифрования
иногдаКаналы tonic, созданные для эндпоинтов https:// (или с конфигурацией TLS), при подключении к серверам, запущенным без TLS.
Как исправить
- 1.
Выясните, по какому протоколу работает порт
Если отвечает обычный HTTP, используйте http:// или TLS-порт сервера.
bash curl -si http://127.0.0.1:8080/ | head -1 # plain HTTP answers -> use http:// or the TLS port - 2.
Приведите схему эндпоинта в соответствие с сервером
Используйте эндпоинты http:// для gRPC-серверов без шифрования в доверенных сетях, а в остальных случаях — https:// с конфигурацией 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?;