«Не удалось аутентифицировать соединение HTTPS» при доступе к веб-API ASP.NET Core 2.1 из React Native - PullRequest
0 голосов
/ 29 августа 2018

У меня есть проект ASP.NET Core 2.1 Web API, который обслуживает данные из базы данных SQL Server. Я установил флажок «Настроить для HTTPS», когда создавал проект API в Visual Studio.

Мне нужно получить доступ к этому API из проекта React Native, и я попытался использовать для него Fetch API. Метод, который я использую, работает, когда я делаю REST-запросы к различным API, но он не работает для моего собственного проекта API. Когда я делаю простой запрос GET к API, я получаю ошибку Network request failed на своем мобильном устройстве, в то время как на стороне API возникает следующая ошибка:

dbug: HttpsConnectionAdapter[1]
      Failed to authenticate HTTPS connection.
System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception. ---> System.ComponentModel.Win32Exception: An unknown error occurred while processing the certificate
   --- End of inner exception stack trace ---
   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
   at System.Net.Security.SslState.ThrowIfExceptional()
   at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult result)
   at System.Net.Security.SslStream.EndAuthenticateAsServer(IAsyncResult asyncResult)
   at System.Net.Security.SslStream.<>c.<AuthenticateAsServerAsync>b__51_1(IAsyncResult iar)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Server.Kestrel.Https.Internal.HttpsConnectionAdapter.InnerOnConnectionAsync(ConnectionAdapterContext context)

Тем не менее, запрос работает нормально, когда я делаю это с помощью Почтальона, и результат следующий:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      Request starting HTTP/1.1 GET https://localhost:5001/api/values application/json
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[2]
      Successfully validated the token.
info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.1-rtm-30846 initialized 'DataContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (62ms) [Parameters=[@__get_Item_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
      SELECT TOP(1) [e].[id], [e].[pw], [e].[pws], [e].[em]
      FROM [ul] AS [e]
      WHERE [e].[id] = @__get_Item_0
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Route matched with {action = "Get", controller = "Values"}. Executing action Api.Controllers.ValuesController.Get (Api)
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[1]
      Authorization was successful.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      Executing action method Api.Controllers.ValuesController.Get (Api) - Validation state: Valid
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action method Api.Controllers.ValuesController.Get (Api), returned result Microsoft.AspNetCore.Mvc.ObjectResult in 0.4905ms.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      Executing ObjectResult, writing value of type 'System.String[]'.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action Api.Controllers.ValuesController.Get (Api) in 30.7297ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
  Request finished in 125.3707ms 200 application/json; charset=utf-8

Дополнительная информация:

Когда я запускаю проект API, появляется следующее диалоговое окно:

Would you like to trust the ASP.NET Core SSL certificate

Нажатие Да приводит к:

Access Control List (ACL) structure is invalid

В чем причина этой ошибки и как мне решить эту проблему?

1 Ответ

0 голосов
/ 29 августа 2018

Согласно этому блогу MSDN вы можете установить сертификат вручную.

  1. Откройте пустую консоль управления Microsoft, нажав кнопку «Пуск», затем «Выполнить», введите «mmc» и нажмите кнопку «ОК»:
  2. Нажмите Файл, а затем нажмите Добавить / удалить оснастку:
  3. Когда появится диалоговое окно «Добавить или удалить оснастку», нажмите «Сертификаты», а затем нажмите «Добавить»:
  4. Когда отобразится диалоговое окно оснасток «Сертификаты», нажмите «Учетная запись компьютера» и нажмите «Далее»:
  5. Нажмите Локальный компьютер, а затем нажмите Готово:
  6. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить или удалить оснастку:
  7. В корне консоли разверните Сертификаты (локальный компьютер), затем разверните Личные и нажмите Сертификаты:
  8. Выберите сертификат со следующими атрибутами: выдан = "localhost", выдан = "localhost", понятное имя = "сертификат разработки IIS Express"
  9. Нажмите «Действие», затем «Все задачи» и затем нажмите «Экспорт»:
  10. Когда откроется Мастер экспорта сертификатов, нажмите Далее:
  11. Нажмите Нет, не экспортировать закрытый ключ, а затем нажмите Далее:
  12. Нажмите DER-кодированный двоичный файл X.509 (.CER), а затем нажмите Далее:
  13. Введите путь для экспортированного сертификата, например, "c: \ users \ robert \ desktop \ iisexpress.cer" и нажмите кнопку Далее:
  14. Нажмите кнопку Готово, чтобы экспортировать сертификат:
  15. Нажмите OK, когда мастер экспорта сертификатов отобразит диалоговое окно, информирующее вас об успешном экспорте:
  16. В корне консоли разверните Сертификаты (локальный компьютер), затем разверните Надежные корневые центры сертификации и нажмите Сертификаты:
  17. Нажмите «Действие», затем «Все задачи», а затем нажмите «Импорт»:
  18. Когда откроется Мастер импорта сертификатов, нажмите Далее:
  19. Введите путь к экспортированному сертификату, например, "c: \ users \ robert \ desktop \ iisexpress.cer" и нажмите кнопку Далее:
  20. Убедитесь, что Поместите все сертификаты в следующее хранилище, отметьте и убедитесь, что для выбранного хранилища сертификатов установлено значение Надежные корневые центры сертификации, а затем нажмите кнопку Далее:
  21. Нажмите кнопку Готово, чтобы импортировать сертификат:
  22. Нажмите OK, когда мастер импорта сертификатов отобразит диалоговое окно, информирующее вас об успешном импорте:
  23. Ваш сертификат IIS Express теперь должен отображаться в списке доверенных корневых центров сертификации как «localhost»:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...