WSS支持C#.exe在https上工作

WSS支持C#.exe在https上工作,c#,https,wss,C#,Https,Wss,我有.net.exe,它监听web套接字。它可以在http上完美地工作。 当我的发件人通过https切换到WSS时,my.exe无法解密传入的请求。 我的客户端接收字节数组,但当我尝试将其解密为UTF编码时,它无法通过Encoding.GetEncoding(“ISO-8859-1”)正确解密 代码: public void ReadCallback(IAsyncResult ar) { 尝试 { //检索状态对象 //和处理程序套接字 //从异步状态对象。 var state=(StateOb

我有.net.exe,它监听web套接字。它可以在http上完美地工作。 当我的发件人通过https切换到WSS时,my.exe无法解密传入的请求。 我的客户端接收字节数组,但当我尝试将其解密为UTF编码时,它无法通过
Encoding.GetEncoding(“ISO-8859-1”)正确解密

代码:

public void ReadCallback(IAsyncResult ar)
{
尝试
{
//检索状态对象
//和处理程序套接字
//从异步状态对象。
var state=(StateObject)ar.AsyncState;
//从客户端套接字读取数据。
var bytesRead=_socket.EndReceive(ar);
//以下代码无法正确解密wss
//但是对ws来说是正确的
Utils.Encoding.GetString(state.Buffer,0,bytesRead);

在您现有的代码中,您在套接字层谈论原始字节,直接从
套接字
编码
。这对于未加密的数据很好,因为数据实际上是相同的字节(尽管……握手的第一部分是文本;在HTTP头之后,您应该处理帧解析器,理想情况下,因此接近
编码
有点危险;上下文:我也直接从
套接字
层编写了一个成功的、高吞吐量的web套接字服务器)

但是:当你在中间有字节翻译时,它不是那么简单——这里TLS是这样的(如果压缩翻译也是这样的话,你也会遇到同样的问题)。 非常简单:需要有人处理实际的TLS工作。如果您决定自己处理细节,那么您最好的选择可能是包装:

Socket
NetworkStream
SslStream
(您的代码)

这意味着您将根据
API而不是
套接字
API进行编码(在初始化服务器流时,可能使用
AuthenticateAsServer()
)。为避免使用两个代码基,您可以使用:

Socket
NetworkStream
(您的代码)

对于
ws
层。但是,坦白地说,最好让框架和库担心这一点-特别是如果您在.NET Core上:您可以使用Kestrel设置具有TLS支持的web服务器,您的代码基本上只是:

public void配置(IApplicationBuilder应用程序)
{
app.UseWebSockets(新WebSocketOptions()
{
//设置KeepAliveInterval/ReceiveBufferSize/etc
});
app.Run(ctx=>
{
if(ctx.WebSockets.IsWebSocketRequest)
{
返回RunClientAsync(ctx);
}
else{/*当不是WS/WSS*/}
});
}
专用异步任务RunClientAsync(HttpContext上下文)
{
var socket=await context.WebSockets.AcceptWebSocketAsync();
//TODO:使用WebSocket API的所有读/写逻辑
}

这种方法在.NET Core 3.1上的可扩展性比在.NET Framework上要好得多(检查我的状态页);我目前在9个节点上运行~518000个并发web套接字连接(因为我碰巧有9个节点可用),几乎0%的CPU,每个节点5个端口(以避免短暂的端口耗尽)每个节点每个端口约11500个连接。我们将自定义的
Socket
级别的代码迁移到.NET Core 3.1中使用
WebSocket
API,因为这些改进意味着我们不再需要维护自己的代码来处理web套接字协议的细微差别.

您使用的是什么web套接字API?它知道它正在使用TLS吗?等等-如果没有一些代码,这很难评论,但可以概括为:“是的,如果配置正确,它可能会工作”`public void ReadCallback(IAsyncResult ar){try{//从异步状态对象检索状态对象//和处理程序套接字//var state=(StateObject)ar.AsyncState;//从客户端套接字读取数据。var bytesRead=_socket.EndReceive(ar);下面的代码对于was不能正确解密,但是对于ws**`Utils.Encoding.GetString(state.Buffer,0,bytesRead)可以正确工作`Encoding.GetsString不解密我的流,这就是问题。
编码
从不处理解密-这不是
编码
的工作-但是:你评论中的代码在这里真的很有帮助;我将它编辑成了问题,因为它非常重要。谢谢你的回答,我现在的问题是,我有遗留服务器(console.exe)它在.net framework上,而不在.net core上。我当前无法将其迁移到.net core。我要查找的是,当我通过“ws”接收请求时,它会正确解密,然后我会向其添加握手,但我的客户端尝试通过“wss”连接它,它无法解密,因此我无法与我的客户端创建握手。客户端部署在安装了证书的ISS上。我已在服务器(.exe)上安装了相同的证书使用私钥,但我的现有代码没有运气。@TusharMali如果您直接与
套接字交谈
:您可能没有在IIS中托管;当然,IIS可能位于同一个框中并拥有证书,但我认为它不涉及此自定义服务器,因此:这与此无关。在您的场景中,我想知道是否需要更实用的选项使用负载平衡器/反向代理作为网关,并在负载平衡器处终止TLS:因此,从外部客户端的角度来看,他们说的是TLS,但从负载平衡器到您的服务的流量:未加密。我在过去使用过haproxy。是的,代理是解决方案之一。