Mensagem de erro
Cannot determine the frame size or a corrupted frame was received.
Também aparece como
- System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.
O mesmo texto no .NET Core, no .NET 5–10 e no .NET Framework. O HttpClient o encapsula em “The SSL connection could not be established, see inner exception.”
.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record
O que significa
O SslStream esperava um cabeçalho de registro TLS e recebeu bytes que não formam um, por isso não consegue nem saber o tamanho do próximo quadro. O outro lado não está falando TLS nessa porta — normalmente é um endpoint de HTTP não criptografado (“HTTP/1.1 400 …”) acessado com https://, ou um protocolo que começa em texto claro.
Por que acontece
https:// em uma porta de HTTP não criptografado
comumChamar a porta HTTP de um serviço (ou a porta de um sidecar, de métricas ou de verificação de integridade) com uma URL https://.
O Kestrel escuta com HTTP na porta que você usa
comumO launchSettings.json ou o ASPNETCORE_URLS configura http:// na porta que o cliente trata como HTTPS, uma confusão frequente entre as portas de desenvolvimento 5xxx e 7xxx.
Um proxy sem TLS configurado como TLS
ocasionalUm endereço de proxy https:// para um proxy que só aceita HTTP não criptografado dos clientes.
Como corrigir
- 1.
Verificar qual protocolo a porta fala
Se a porta responder com HTTP não criptografado, use a porta HTTPS ou http://.
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
Usar a URL HTTPS em que o Kestrel escuta
Verifique o applicationUrl ou o ASPNETCORE_URLS e chame o endereço https:// com a porta dele.
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
E-mail: portas STARTTLS exigem STARTTLS
Com o MailKit, use SecureSocketOptions.StartTls na porta 587 e SslOnConnect apenas na 465.
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);