Не удалось аутентифицировать HTTPS-соединение при попытке GET из WebAPI.C#

Место общения программистов C#
Anonymous
Не удалось аутентифицировать HTTPS-соединение при попытке GET из WebAPI.

Сообщение Anonymous »

Я использую ASP.NET Core. У меня есть два проекта:
  • Приложение ASP.NET Core MVC
  • Приложение ASP.NET Core Web API
Если я попытаюсь получить доступ к одной из конечных точек веб-API с помощью Postman, у меня не возникнет никаких проблем; конечная точка /api/values возвращает ожидаемый результат. (Это стандартная конечная точка теста.)

Однако если я попытаюсь выполнить ту же операцию с помощью приложения MVC, я получу очень неприятную ошибку:

Код: Выделить всё

HttpsConnectionFilter[1]
Failed to authenticate HTTPS connection
Я использую Kestrel для ASP.NET Core.

У меня есть самозаверяющий сертификат PFX, который я создал с помощью PowerShell, и это код, вызывающий исключение:

Код: Выделить всё

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");
Моя установка Kestrel такая же, как в моем 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()
.Build();

host.Run();
Я знаю, что снова определил сертификат для HttpClient выше, но я в отчаянии.

Может ли кто-нибудь подсказать, почему это происходит и как я могу это исправить или даже отладить? В настоящее время я просматриваю код KestrelHttpServer, чтобы посмотреть, даст ли это некоторую информацию.

Это полная ошибка, которую я получаю в окне консоли Kestrel:


info: HttpsConnectionFilter1
Не удалось проверить подлинность HTTPS-соединения. System.IO.IOException: проверка подлинности не удалась, поскольку удаленная сторона закрыла
транспортный поток. at
System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32
readBytes, AsyncProtocolRequest asyncRequest) at
System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest
asyncRequest)
--- Конец трассировки стека из предыдущего местоположения где было создано исключение --- at
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at
System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult
lazyResult) at
System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult
result) at
System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult
asyncResult) в
System.Threading.Tasks.TaskFactory

Код: Выделить всё

1.FromAsyncCoreLogic(IAsyncResult
iar, Func
2 endFunction, Действие

Код: Выделить всё

1 endAction, Task
1 обещание, логическое значение
требует синхронизации)
--- Конец трассировки стека из предыдущего места, где было создано исключение --- в
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
Task) в
Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionFilter.d__6.MoveNext()

Вернуться в «C#»