简体   繁体   中英

'Failed to authenticate HTTPS connection' while accessing ASP.NET Core 2.1 Web API from React Native

I have an ASP.NET Core 2.1 Web API project that is serving data from an SQL Server database. I checked 'Configure for HTTPS' option while I was creating the API project in Visual Studio.

I need to access this API from a React Native project, and I have tried using the Fetch API for it. The method I am using works when I make REST requests to different APIs but it is not working for my own API project. When I make a simple GET request to the API, I receive a Network request failed error on my mobile device, while on the API end, following error stack is encountered:

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)

However, the request works fine when I make it using Postman, and following is the result:

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

Additional info:

When I run the API project, following dialogue box appears:

您想信任 ASP.NET Core SSL 证书吗

Clicking Yes results in:

访问控制列表 (ACL) 结构无效

What is the reason for this error and how should I go about solving this issue?

According to this MSDN blog you can install the certificate manually.

  1. Open a blank Microsoft Management Console by clicking Start, then Run, entering "mmc" and clicking OK:
  2. Click File, and then click Add/Remove Snap-in:
  3. When the Add or Remove Snap-ins dialog box is displayed, click Certificates, and then click Add:
  4. When the Certificates Snap-ins dialog box is displayed, click Computer account, and then click Next:
  5. Click Local computer, and then click Finish:
  6. Click OK to close the Add or Remove Snap-ins dialog box:
  7. In the Console Root, expand Certificates (Local Computer), then expand Personal, and then click Certificates:
  8. Select the certificate with the following attributes: Issued to = "localhost", Issued by = "localhost", Friendly Name = "IIS Express Development Certificate"
  9. Click Action, then click All Tasks, and then click Export:
  10. When the Certificate Export Wizard is displayed, click Next:
  11. Click No, do not export the private key, and then click Next:
  12. Click DER encoded binary X.509 (.CER), and then click Next:
  13. Enter the path for exported certificate, eg "c:\\users\\robert\\desktop\\iisexpress.cer", and then click Next:
  14. Click Finish to export the certificate:
  15. Click OK when the Certificate Export Wizard displays a dialog box informing you that the export was successful:
  16. In the Console Root, expand Certificates (Local Computer), then expand Trusted Root Certification Authorities, and then click Certificates:
  17. Click Action, then click All Tasks, and then click Import:
  18. When the Certificate Import Wizard is displayed, click Next:
  19. Enter the path to your exported certificate, eg "c:\\users\\robert\\desktop\\iisexpress.cer", and then click Next:
  20. Ensure that Place all certificates in the following store is checked and verify that the selected Certificate store is set to Trusted Root Certification Authorities, and then click click Next:
  21. Click Finish to import the certificate:
  22. Click OK when the Certificate Import Wizard displays a dialog box informing you that the import was successful:
  23. You IIS Express certificate should now be displayed in the listed of Trusted Root Certification Authorities as "localhost":

this my solution

dotnet dev-certs https
dotnet dev-certs https --trust

此解决方案解决了问题https://stackoverflow.com/a/59539907/8722913

dotnet dev-certs https --clean

dotnet dev-certs https --trust

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM