web-dev-qa-db-ja.com

WebApiからGETを試行するとHTTPS接続の認証に失敗しました

ASP.Net Coreを使用していて、2つのプロジェクトがあります。

  1. ASP.Net Core MVCアプリケーション
  2. ASP.Net Core WebApiアプリケーション

Postmanを使用してWebApiエンドポイントの1つを試行しても問題は発生せず、/ api/valuesは期待どおりに戻ります(標準テストエンドポイント)

ただし、MVCアプリケーションを使用して同じ操作を試みると、非常にイライラするエラーが発生します。

HttpsConnectionFilter[1]
Failed to authenticate HTTPS connection

Asp.NetコアのKestrelを使用してホストしています。

私はpowershellを使用して作成した自己署名PFX証明書を持っていますが、これは例外をスローするコードです:

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2("localcert.pfx", "xxx"));
var client = new HttpClient(handler);

var content = await client.GetStringAsync("https://localhost:44301/api/values");

そして、これを実行しようとすると、同じエラーが発生します。

var client = new HttpClient();

var content = await client.GetStringAsync("https://localhost:44301/api/values");

私のケストレルのセットアップは私のProgram.csのようです

var cert = new X509Certificate2("localcert.pfx", "xxx");

var Host = new WebHostBuilder()
    .UseKestrel(cfg => cfg.UseHttps(cert))
    .UseUrls("https://localhost:44300")
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

Host.Run();

上記のHttpClientの証明書を再度定義したことは知っていますが、必死です。

なぜこれが起こっているのか、そして私がそれを修正する方法、または私を狂わせているのでデバッグする方法について、誰かが洞察を提供できますか?私はKestrelHttpServerコードを調べてステップ実行し、洞察が得られるかどうかを確認しています。

これは、Kestrelコンソールウィンドウから発生する完全なエラーです

info:HttpsConnectionFilter 1 HTTPS接続の認証に失敗しました。 System.IO.IOException:リモートパーティがトランスポートストリームを閉じたため、認証に失敗しました。 System.Net.Security.SslState.StartReadFrame(Byte [] buffer、Int32 readBytes、AsyncProtocolRequest asyncRequest)at System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest)---例外がスローされた前の場所からのスタックトレースの終わり--- System.Net.Security.System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult結果)のSystem.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)のSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()で。 SslStream.EndAuthenticateAsServer(IAsyncResult asyncResult)at System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction、Action1 endAction, Task1 promise、Boolean requireSynchronization)---例外がスローされた前の場所からのスタックトレースの終わり--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__6.MoveNext()で

12
pieperu

私も同じ問題を抱えていました。可能なすべてのこと、そして不可能なことさえも何時間もチェックした後、私はそれをなんとかして誤って生成されたSSL証明書までたどることができました。

私はこのマニュアルに従って鉱山を作成していました: 方法:独自のテスト証明書を作成する

証明書は次のコマンドを使用して生成されます。

makecert -sv yourprivatekeyfile.pvk -n "cert name" yourcertfile.cer -r

ここで-rは省略され、記載されているエラーが発生します。

次に、pfxをマニュアルに従って生成する必要があります。 cerだけを使用すると、Kestrelは正常に起動しません。

新しいSSL証明書を生成して解決しました。

3
Matyas