无法在 WebApp 和 WebApi 之间建立 SSL 连接(Asp Core 3.1)
The SSL connection could not be established between WebApp and WebApi (Asp Core 3.1)
我写了一个 ASP.NET Core 3.1 MVC web 应用程序。它是调用 Web API 后端的前端。
该应用程序在开发和登台上完美运行。
我无法在生产环境中使用它:Web API 似乎还可以,我可以从浏览器或 Postman 调用它。
但我无法从我的网络应用程序访问它。这是尝试拨打电话时日志中的错误:
info: System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
Sending HTTP request GET https://webapi.****.it/inetApi/api/links
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
--- End of inner exception stack trace ---
暂存和生产都是 Windows 带有 IIS10 网络服务器的服务器 2019 机器。
Staging 有一个网站,其中 Web API 和 Web 应用程序 运行 作为应用程序:
Web-t.****.it/inetApi
Web-t.****.it/inetW
生产 VM 有两个网站,一个应该用于内部 Web 应用程序,另一个用于 APIs:
webapi.****.it/inetApi
intranet.****.it/inetW
我们从头开始制作这个 VM,它是新的,上面没有任何其他应用程序或网站。
我已经尝试将 Web API 应用程序移动到 Web 应用程序的同一网站中,看看是否是问题所在,但事实并非如此。
我试图在我的 startup.cs:
中使用它来强制 Web 应用程序使用 TLS 作为安全协议
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
但它只改变了错误:
info: System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
Sending HTTP request GET https://webapi.****.it/inetApi/api/links
fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Net.Http.HttpRequestException: An error occurred while sending the request.
System.Net.Http.WinHttpException (80072EFF, 12030): Error 12030 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, 'The connection with the server was terminated abnormally'.
at System.Threading.Tasks.RendezvousAwaitable`1.GetResult()
at System.Net.Http.WinHttpHandler.StartRequestAsync(WinHttpRequestState state)
--- End of inner exception stack trace ---
所以我尝试在暂存或开发中从 Web 应用程序调用生产 Web API,它起作用了。
然后我尝试在生产环境中使用 Web 应用程序和暂存 Web API...而且它也有效!
这让我抓狂。
就好像生产中的所有东西都在单独工作,而不是一起工作。
我有资金可以在 VM 上做我需要的一切......但我是一名开发人员(并且不太擅长处理系统),我不能向系统管理员寻求太多帮助,因为他们是这期间不知所措。
有什么想法吗?
根据Transport security Best practice,在建立SSL连接时尽量不要指定SSL版本。让 OS 决定 SSL 协议版本。
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
服务器端安装的 SSL 证书的验证过程可能有问题。如您所知,SSL 通信需要客户端和服务器端之间的信任关系,因此我想知道您如何为您的 WebAPI 项目指定证书。客户端和服务器端建立信任关系了吗?即在客户端安装服务证书。至于如何在开发和暂存环境中正常工作,Http Get
请求不代表什么,请尝试 Http Post
请求。
另外,SSL协议需要DotNetframework/OS支持,尝试安装高版本的DotNet框架
如果你之后有新的东西,请随时告诉我。
我写了一个 ASP.NET Core 3.1 MVC web 应用程序。它是调用 Web API 后端的前端。
该应用程序在开发和登台上完美运行。
我无法在生产环境中使用它:Web API 似乎还可以,我可以从浏览器或 Postman 调用它。
但我无法从我的网络应用程序访问它。这是尝试拨打电话时日志中的错误:
info: System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
Sending HTTP request GET https://webapi.****.it/inetApi/api/linksfail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host..
System.Net.Sockets.SocketException (10054): An existing connection was forcibly closed by the remote host.
--- End of inner exception stack trace ---
暂存和生产都是 Windows 带有 IIS10 网络服务器的服务器 2019 机器。
Staging 有一个网站,其中 Web API 和 Web 应用程序 运行 作为应用程序:
Web-t.****.it/inetApi
Web-t.****.it/inetW
生产 VM 有两个网站,一个应该用于内部 Web 应用程序,另一个用于 APIs:
webapi.****.it/inetApi
intranet.****.it/inetW
我们从头开始制作这个 VM,它是新的,上面没有任何其他应用程序或网站。
我已经尝试将 Web API 应用程序移动到 Web 应用程序的同一网站中,看看是否是问题所在,但事实并非如此。
我试图在我的 startup.cs:
中使用它来强制 Web 应用程序使用 TLS 作为安全协议ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
但它只改变了错误:
info: System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
Sending HTTP request GET https://webapi.****.it/inetApi/api/linksfail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
An unhandled exception has occurred while executing the request.
System.Net.Http.HttpRequestException: An error occurred while sending the request.
System.Net.Http.WinHttpException (80072EFF, 12030): Error 12030 calling WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, 'The connection with the server was terminated abnormally'.
at System.Threading.Tasks.RendezvousAwaitable`1.GetResult()
at System.Net.Http.WinHttpHandler.StartRequestAsync(WinHttpRequestState state)
--- End of inner exception stack trace ---
所以我尝试在暂存或开发中从 Web 应用程序调用生产 Web API,它起作用了。
然后我尝试在生产环境中使用 Web 应用程序和暂存 Web API...而且它也有效!
这让我抓狂。
就好像生产中的所有东西都在单独工作,而不是一起工作。
我有资金可以在 VM 上做我需要的一切......但我是一名开发人员(并且不太擅长处理系统),我不能向系统管理员寻求太多帮助,因为他们是这期间不知所措。
有什么想法吗?
根据Transport security Best practice,在建立SSL连接时尽量不要指定SSL版本。让 OS 决定 SSL 协议版本。
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
服务器端安装的 SSL 证书的验证过程可能有问题。如您所知,SSL 通信需要客户端和服务器端之间的信任关系,因此我想知道您如何为您的 WebAPI 项目指定证书。客户端和服务器端建立信任关系了吗?即在客户端安装服务证书。至于如何在开发和暂存环境中正常工作,Http Get
请求不代表什么,请尝试 Http Post
请求。
另外,SSL协议需要DotNetframework/OS支持,尝试安装高版本的DotNet框架
如果你之后有新的东西,请随时告诉我。