エラーメッセージ
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:// で接続した場合や、平文で始まるプロトコルの場合です。
発生する理由
平文 HTTP のポートに https:// で接続している
よくあるサービスの HTTP ポート(またはサイドカー、メトリクス、ヘルスチェックのポート)を https:// の URL で呼び出しているケースです。
使用しているポートで Kestrel が HTTP で待ち受けている
よくあるlaunchSettings.json または ASPNETCORE_URLS で、クライアントが HTTPS として扱うポートに http:// が設定されています。開発用ポートの 5xxx と 7xxx の間でよく起きる取り違えです。
平文のプロキシを TLS として設定している
ときどきクライアントからの平文 HTTP しか受け付けないプロキシに対して、https:// のプロキシアドレスを指定しているケースです。
修正方法
- 1.
ポートが何のプロトコルで応答するかを確認する
平文 HTTP で応答がある場合は、HTTPS のポートを使うか、http:// を使ってください。
bash curl -si http://api.example.com:8080/ | head -1 # answers over plain HTTP? - 2.
Kestrel が待ち受けている HTTPS の URL を使う
applicationUrl または ASPNETCORE_URLS を確認し、https:// のアドレスをそのポート番号付きで呼び出してください。
json { "profiles": { "https": { "commandName": "Project", "applicationUrl": "https://localhost:7001;http://localhost:5001" } } } - 3.
メール:STARTTLS のポートには STARTTLS が必要
MailKit では、587 番ポートには SecureSocketOptions.StartTls を使い、SslOnConnect は 465 番ポートでのみ使ってください。
csharp // MailKit: STARTTLS on 587, implicit TLS (SslOnConnect) on 465 await smtp.ConnectAsync("mail.example.com", 587, MailKit.Security.SecureSocketOptions.StartTls);