Перейти к содержимому
ecdsa.com
.NET SslStream / HttpClient.NET

Сообщение об ошибке

Cannot determine the frame size or a corrupted frame was received.

Также выводится как

  • System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.

Тот же текст в .NET Core, .NET 5–10 и .NET Framework. HttpClient оборачивает его в «The SSL connection could not be established, see inner exception.»

.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record

Что это означает

SslStream ожидал заголовок записи TLS, а получил байты, которые его не образуют, поэтому не может даже определить длину следующего фрейма. Другая сторона на этом порту не использует TLS: обычно это эндпоинт с обычным HTTP («HTTP/1.1 400 …»), к которому обратились по https://, или протокол, сеанс которого начинается без шифрования.

Почему это происходит

Как исправить

  1. 1.

    Проверьте, какой протокол работает на порту

    Если отвечает обычный HTTP, используйте HTTPS-порт или http://.

    bash
    curl -si http://api.example.com:8080/ | head -1    # answers over plain HTTP?
  2. 2.

    Используйте URL с HTTPS, который слушает Kestrel

    Проверьте applicationUrl или ASPNETCORE_URLS и обращайтесь по адресу https:// с указанным там портом.

    json
    {
      "profiles": {
        "https": {
          "commandName": "Project",
          "applicationUrl": "https://localhost:7001;http://localhost:5001"
        }
      }
    }
  3. 3.

    Почта: на портах STARTTLS нужен STARTTLS

    В MailKit используйте SecureSocketOptions.StartTls на порту 587, а SslOnConnect — только на 465.

    csharp
    // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465
    await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);

Связанные ошибки

Открыть всю базу ошибок подписей