Windows 服务中的安全 Websocket 客户端在发送期间超时

Posted

技术标签:

【中文标题】Windows 服务中的安全 Websocket 客户端在发送期间超时【英文标题】:Secure Websocket Client in Windows Service times out during Send 【发布时间】:2021-12-30 13:19:52 【问题描述】:

更新:以下是在 Windows Server 2016 上运行的案例。最近尝试在 Windows Server 2022 上运行,我可以成功地将库作为控制台应用程序运行。它仍然不会作为 Windows 服务运行(也尝试以管理员权限运行 Windows 服务。)

我有一个 .Net 4.8 类库,它使用 Marfusios Websocket 客户端与安全的 websocket (wss) 服务器进行通信。当作为 Windows 服务或控制台应用程序运行时,客户端在连接后的初始发送请求期间超时。但是,如果客户端运行在由 IIS 10 托管的 .Net Web 应用程序中与失败的 Windows 服务位于同一服务器上,则客户端会正确连接和通信。

当在 Windows 服务或控制台应用程序下运行时,该库可以连接/启动 websocket 客户端,但挂起发送到服务器,这是由 websocket 客户端的 OnReconnection 事件触发的。使用带有代理的 Fiddler,我可以看到 KeepAlive Ping-Pong 消息发生在连接后,但看不到在 OnReconnection 中发送的 Send 消息。

最终,来自 websocket-client 的错误冒出并报告以下错误:

System.Net.WebSockets.WebSocketException (0x80004005):远端未完成关闭握手就关闭了WebSocket连接。 在 System.Net.WebSockets.WebSocketBase.WebSocketOperation.d__19.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Net.WebSockets.WebSocketBase.d__45.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Websocket.Client.WebsocketClient.d__70.MoveNext()

我相信这个错误是由于我的客户端没有通信后 websocket 服务器断开连接造成的。运行 websocket 客户端库的 Windows Server 安装了有效的 Starfield SSL 证书并安装了 TLS1.2。 websocket 服务器所有者说他们正在使用 TLS1.2,并使用 WireShark 确认。

我已阅读并尝试了所有与此错误和主题相关的内容,包括:ValidateServerCertificate 和 System.Net.ServicePointManager.SecurityProtocol

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

问题是程序集依赖冲突。出于某种我在 Windows 服务中运行时不理解的原因,我的库没有加载 Marfusios Websocket 客户端所需的 System.Runtime.CompilerServices.Unsafe 程序集的本地版本,直到我将以下绑定添加到app.config 文件。从控制台应用程序或在 IIS 下运行我的库时,不需要此条目。

<dependentAssembly>
        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>

相关的 File Not Found 异常没有从 Marfusios Websocket 客户端冒泡到我的错误日志或 Windows 应用程序或系统事件日志。它只是默默地失败了,因为错误是在 TRACE 级别记录的,而我的解决方案的日志记录(Log4Net)没有捕获它。在我的解决方案中包含 Websocket-client 项目而不是引用 NuGet 包允许我修改揭示问题的日志记录。

【讨论】:

以上是关于Windows 服务中的安全 Websocket 客户端在发送期间超时的主要内容,如果未能解决你的问题,请参考以下文章

安全的 WebSocket 和 PHP

我的 websocket 的服务器源检查安全吗?

Python 安全 websocket 内存消耗

WebSocket 身份验证安全性

接受用于安全 websocket 连接的服务器证书

ruby 中的安全 Websocket 客户端