Mensaje de error
Cannot determine the frame size or a corrupted frame was received.
También se muestra como
- System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.
El mismo texto en .NET Core, .NET 5–10 y .NET Framework. HttpClient lo envuelve en «The SSL connection could not be established, see inner exception.»
.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record
Qué significa
SslStream esperaba el encabezado de un registro TLS y recibió bytes que no lo forman, así que ni siquiera puede saber cuánto mide la siguiente trama. El otro extremo no habla TLS en ese puerto: normalmente es un endpoint HTTP sin cifrar («HTTP/1.1 400 …») al que se accede con https://, o un protocolo que empieza en texto sin cifrar.
Por qué ocurre
https:// con un puerto HTTP sin cifrar
frecuenteLlamar al puerto HTTP de un servicio (o al de un sidecar, al de métricas o al de comprobación de estado) con una URL https://.
Kestrel escucha con HTTP en el puerto que usas
frecuentelaunchSettings.json o ASPNETCORE_URLS configuran http:// en el puerto que el cliente trata como HTTPS, una confusión frecuente entre los puertos de desarrollo 5xxx y 7xxx.
Un proxy HTTP sin cifrar configurado como TLS
ocasionalUna dirección de proxy https:// para un proxy que solo acepta HTTP sin cifrar de los clientes.
Cómo solucionarlo
- 1.
Comprobar qué protocolo habla el puerto
Si responde HTTP sin cifrar, usa el puerto HTTPS o http://.
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
Usar la URL HTTPS en la que escucha Kestrel
Comprueba applicationUrl o ASPNETCORE_URLS y llama a la dirección https:// con su puerto.
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
Correo: los puertos STARTTLS requieren STARTTLS
Con MailKit, usa SecureSocketOptions.StartTls en el 587 y SslOnConnect solo en el 465.
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);