如何在客户端和服务器位置都是动态时通过 TLS 运行 C# Websockets

How to run c# websockets over TLS when both client and server location are dynamic?

本文关键字:TLS 运行 Websockets 动态 客户端 服务器 位置      更新时间:2023-09-26

当连接的两端都在可变位置时,我正在尝试让安全的Websocket线路运行。

我在做什么:

我有一个运行Websocket服务器(Fleck(的c#程序,该程序部署到用户的机器上。接下来,我有一个网站和一个运行Websocket客户端的Android应用程序(分别在javascript和java中(。客户端知道如何连接到服务器(通过 php 从数据库中查询(。

因此,通过这种方式,从

客户端到服务器建立了直接连接,而无需通过网站或任何东西,这主要是因为它可以包含敏感信息,并且不必让网站触摸这是一个巨大的优势!网站本身使用受信任的证书运行HTTPS。

c# Fleck 服务器需要 WSS 的 pfx 证书,我尝试使用 openSSL 和我用于网站的证书来制作。但是当 websocket 证书不好时,浏览器会静默地断开连接。如果我转到 https://localhost:port,我会收到预期的浏览器警告,指出我的域与证书不匹配,同样的错误可能是浏览器丢弃 websocket 连接的原因,因为用户的 PC 或他们连接的任何计算机/手机都没有使用该域。

如果我的上述观察是正确的,那么从本质上讲,我需要具有可变域的受信任证书之类的东西。这样的事情存在吗?

谢谢你的时间!

如果我

正确理解您的架构,您就有:

  • 在客户端个人计算机上运行的Websocket服务器,通常位于某个专用网络内的某个路由器/防火墙后面。
  • Websocket客户端位于不同位置,特别是在Android应用程序和Web服务器上。这些 Websocket 客户端可能与 Websocket 服务器位于同一本地网络中,但也可能在某个外部公用网络或某个不同的专用网络中。

现在,您正在尝试通过使用WSS(即基于TLS的Websockt(和Websocket服务器的一些证书来保护客户端和服务器之间的通信。并且您希望对所有 Websocket 端点使用相同的证书,并且它应随服务器应用程序一起提供。

由于以下几个原因,这种设置将不起作用:

  • 由于 Websocket 服务器位于个人计算机上,该计算机主要位于某个内部本地网络内部,因此无法从外部访问,除非用户为路由器或防火墙上的传入连接添加特定的端口转发规则。
  • 如果要对所有服务器实例使用相同的证书,则不仅需要将证书与 Websocket 服务器应用程序一起提供匹配的私钥。这意味着任何人都可以提取证书和私钥,并将其用于自己的假服务器或对您的系统进行中间人攻击。

与这些问题相反,证书中的名称实际上不是什么大问题,因为您可以简单地对此固定证书使用证书/公钥固定,而不是检查证书链和主机名。但同样,我认为整个设计是有缺陷的。

除此之外,security.stackexchange.com 可能是询问有关安全架构问题的更好地方。

No...拥有一个可变域将打破"信任"的概念。 如果有人可以使用您的证书...然后任何人都可以使用您的证书。 您的用户是否知道您正在他们的计算机上设置网络服务器? 请记住..用户必须向托管此 Web 服务器的服务器打开防火墙。

可能最好的选择是将客户端代码设置为忽略证书问题并继续。