我希望托管一些基于websocket的应用程序,这些应用程序应该只能通过https页面访问。因此,服务器生成https页面,其中包含一个随机密钥。我想使用这个密钥来防止外部人员间接访问网络套接字。
我可以让每个websocket客户端将密钥发送到websocket服务器,如果密钥不匹配,则关闭连接。然而,我更愿意更新websocket本身以传递密钥,并在密钥不匹配的情况下自动拒绝连接。(这样,如果引入了一个新的应用程序,就不会忘记执行检查)。
我环顾四周,没有发现太多关于websocket如何工作的深入文档。
wss连接的初始握手是否是明文发送的(如果我将密钥附加到这些数据包上,中间的人会拦截它们吗?)。如果没有,有没有一种标准的方式在连接上发送这种元数据,或者我应该只破解websocket源文件?
我在服务器端使用libwebsockets,在客户端使用jquery.websockets。
只有在建立安全连接后,安全WebSocket连接才会升级:
- 如果/security/为true,则客户端必须通过打开连接之后和发送之前的连接握手数据[RFC2818]。如果失败(例如,服务器证书无法验证),则客户端必须失败WebSocket连接并中止连接。否则该通道上的所有进一步通信必须通过加密隧道[RFC5246]
Clients MUST use the Server Name Indication extension in the TLS
handshake [RFC6066].
RFC 6455,第17页
在客户端,WebSocket
接口由浏览器提供——当您到达onopen
事件时,握手已经完成。您可以将密钥放在protocol
中,但这肯定是一个黑客攻击(因为protocol
用于实际注册的协议,而不是身份验证机制)。
另一种选择是简单地将WebSocket封装在您自己的库中,该库处理第一条消息上的密钥交换,这样您的应用层就不必担心细节了。