Message d’erreur
Cannot determine the frame size or a corrupted frame was received.
Également affiché sous la forme
- System.Security.Authentication.AuthenticationException: Cannot determine the frame size or a corrupted frame was received.
Même texte dans .NET Core, .NET 5–10 et .NET Framework. HttpClient l’enveloppe dans « The SSL connection could not be established, see inner exception. »
.NET SslStream / HttpClient — AuthenticationException when the peer's reply is not a TLS record
Ce que cela signifie
SslStream attendait un en-tête d’enregistrement TLS et a reçu des octets qui n’en forment pas un : il ne peut même pas déterminer la longueur de la trame suivante. L’autre partie ne parle pas TLS sur ce port : il s’agit généralement d’un point de terminaison HTTP en clair (« HTTP/1.1 400 … ») contacté en https://, ou d’un protocole qui commence en texte clair.
Pourquoi cela se produit
https:// vers un port HTTP en clair
fréquenteAppeler avec une URL https:// le port HTTP d’un service (ou d’un sidecar, ou encore un port de métriques ou de contrôle d’intégrité).
Kestrel écoute en HTTP sur le port que vous utilisez
fréquentelaunchSettings.json ou ASPNETCORE_URLS configure http:// sur le port que le client traite comme HTTPS, une confusion fréquente entre les ports de développement 5xxx et 7xxx.
Un proxy en clair configuré comme TLS
occasionnelleUne adresse de proxy en https:// pour un proxy qui n’accepte que du HTTP en clair de la part des clients.
Comment corriger l’erreur
- 1.
Vérifier le protocole que parle le port
Si c’est du HTTP en clair qui répond, utilisez le port HTTPS ou http://.
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
Utiliser l’URL HTTPS sur laquelle écoute Kestrel
Vérifiez applicationUrl ou ASPNETCORE_URLS et appelez l’adresse https:// avec son port.
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
Messagerie : les ports STARTTLS exigent STARTTLS
Avec MailKit, utilisez SecureSocketOptions.StartTls sur le port 587 et SslOnConnect uniquement sur le port 465.
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);