0

我希望托管一些基于 websocket 的应用程序,这些应用程序只能通过 https 页面访问。因此,服务器生成带有随机密钥的 https 页面。我想使用此密钥来防止外部人员间接访问 websocket。

我可以让每个 web socket 客户端将密钥发送到 websocket 服务器,如果密钥不匹配,则关闭连接。但是,我希望自己更新 websocket 以传递密钥,如果密钥不匹配,则自动拒绝连接。(这样,如果引入了新的应用程序,就不会忘记实施检查)。

我环顾四周,并没有找到关于 websockets 如何工作的深入文档。

wss 连接的初始握手是否以明文形式发送(如果我将密钥附加到这些数据包,中间人可以拦截它们吗?)。如果没有,是否有一种标准方法可以在连接上发送此类元数据,还是我应该破解 websocket 源文件?

我在服务器端使用 libwebsockets,在客户端使用 jquery.websockets。

4

1 回答 1

1

安全 WebSocket 连接仅在安全连接建立后升级:

  1. 如果 /secure/ 为真,客户端必须在打开连接之后和发送握手数据之前对连接执行 TLS 握手 [RFC2818]。如果失败(例如,无法验证服务器的证书),则客户端必须使 WebSocket 连接失败并中止连接。否则,此通道上的所有进一步通信必须通过加密隧道 [RFC5246]。
 Clients MUST use the Server Name Indication extension in the TLS
   handshake [RFC6066].

RFC 6455,第 17 页

在客户端,WebSocket界面由浏览器提供——当您到达onopen事件时,握手已经完成。您可以将密钥放在 中protocol,但这肯定是一种黑客攻击(因为protocol它是用于实际注册的协议,而不是身份验证机制)。

另一种方法是简单地将 WebSocket 包装在您自己的库中,该库处理第一条消息上的密钥交换,这样您的应用程序层就不必担心细节。

于 2014-09-19T16:32:16.600 回答