【问题标题】:The SSL connection could not be established between WebApp and WebApi (Asp Core 3.1)无法在 WebApp 和 WebApi (Asp Core 3.1) 之间建立 SSL 连接
【发布时间】:2020-05-26 20:37:01
【问题描述】:

我编写了一个 ASP.NET Core 3.1 MVC Web 应用程序。它是一个调用 Web API 后端的前端。

该应用程序在开发和暂存方面完美运行。

我无法让它在生产环境中运行:Web API 似乎还可以,我可以从浏览器或 Postman 中调用它。

但我无法从我的网络应用程序访问它。这是尝试拨打电话时日志中的错误:

信息:System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
发送 HTTP 请求 GET https://webapi.****.it/inetApi/api/links

失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]

执行请求时发生未处理的异常。

System.Net.Http.HttpRequestException:无法建立 SSL 连接,请参阅内部异常。

System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭..

System.Net.Sockets.SocketException (10054):现有连接被远程主机强行关闭。

---内部异常堆栈跟踪结束---

Staging 和 Production 都是带有 IIS10 Web 服务器的 Windows server 2019 机器。

Staging 有一个网站,其中 Web API 和 Web 应用程序都作为应用程序运行:

Web-t.****.it/inetApi
Web-t.****.it/inetW

生产虚拟机有两个网站,一个用于内部 Web 应用,另一个用于 API:

webapi.****.it/inetApi
intranet.****.it/inetW

我们从头开始制作这个虚拟机,它是新的,上面没有任何其他应用程序或网站。

我已经尝试将 Web API 应用程序移动到 Web 应用程序的同一个网站,看看这是否可能是问题所在,但事实并非如此。

我试图在我的 startup.cs 中强制网络应用使用 TLS 作为安全协议:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

但它只会改变错误:

信息:System.Net.Http.HttpClient.IApiClient.ClientHandler[100]
发送 HTTP 请求 GET https://webapi.****.it/inetApi/api/links

失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]

执行请求时发生未处理的异常。

System.Net.Http.HttpRequestException:发送请求时出错。

System.Net.Http.WinHttpException (80072EFF, 12030):调用 WINHTTP_CALLBACK_STATUS_REQUEST_ERROR 时出现错误 12030,“与服务器的连接异常终止”。

在 System.Threading.Tasks.RendezvousAwaitable`1.GetResult()
在 System.Net.Http.WinHttpHandler.StartRequestAsync(WinHttpRequestState 状态)
--- 内部异常堆栈跟踪结束 ---

因此,我尝试在暂存或开发时从 Web 应用调用生产 Web API,它可以正常工作。

然后我尝试在生产环境中使用带有暂存 Web API 的网络应用程序......它也可以工作!

这让我发疯了。

就像生产中的所有东西都在单独工作,而不是一起工作。

我有权在虚拟机上做我需要做的所有事情...但我是一名开发人员(并且不擅长处理系统),我无法向系统管理员寻求太多帮助,因为他们不堪重负这段时间。

有什么想法吗?

【问题讨论】:

    标签: ssl asp.net-web-api httpclient asp.net-core-3.1 iis-10


    【解决方案1】:

    根据Transport security Best practice,在建立SSL连接的过程中尽量不要指定SSL版本。让操作系统决定 SSL 协议版本。
    https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls
    安装在服务器端的 SSL 证书的验证过程可能有问题。如您所知,SSL 通信需要客户端和服务器端之间的信任关系,因此我想知道您如何为您的 WebAPI 项目指定证书。客户端和服务器端建立信任关系了吗?即在客户端安装服务证书。至于如何在开发和暂存环境中正常工作,Http Get 请求不代表什么,请尝试Http Post 请求。
    另外,SSL协议需要DotNet框架/OS支持,请尝试安装高版本的DotNet框架。
    如果你之后有新的东西,请随时告诉我。

    【讨论】:

    • 暂存和生产都运行最后一个 ASP.NET Core 运行时 (3.1.4)。 Staging 上的所有动词(POST、PUT、...)都可以正常工作。在登台和生产中,webapi 和 Web 应用程序与应用程序在同一个 IIS 实例上运行。在生产中,它们在不同的网站上运行(不同的绑定 Web-t.****.it/inetApiWeb-t.****.it/inetW,相同的证书)。我忘了说些什么。生产使用负载均衡器。我要求系统管理员停用它,但他只关闭了一台服务器。所以请求仍然通过它。而且我开始认为问题可能出在其中......
    • 我想我找到了问题所在。部分原因是共享配置对环境变量的错误复制。但主要原因是在 webapi 上的登台和生产中运行时排除了 useHsts 的错误 if 语句。我如此固执地寻找服务器之间的差异,我没有考虑到问题可能是在生产中而不是在暂存中。生产需要 HSTS。所以我猜你给我指出了正确的方向。干杯
    猜你喜欢
    • 1970-01-01
    • 2021-02-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多