我希望托管一些基于websocket的应用程序,这些应用程序只能通过https页面访问。因此,服务器生成带有随机密钥的https页面。我希望使用此密钥来防止外部人员间接访问websockets。
我可以让每个Web套接字客户端将密钥发送到websocket服务器,如果密钥不匹配则关闭连接。但是,我更希望更新websockets本身以传递密钥,并在密钥不匹配时自动拒绝连接。 (这样,如果引入新的应用程序,就不会忘记执行检查)。
我环顾四周,并没有找到有关websockets如何工作的深入文档。
wss连接的初始握手是否以明文形式发送(如果我将密钥附加到那些数据包,中间人可以拦截它们吗?)。如果没有,是否有一种标准的方式在连接上发送这种元数据,或者我应该只修改websocket源文件?
我在服务器端使用libwebsockets,在客户端使用jquery.websockets。
答案 0 :(得分:1)
Secure WebSocket连接仅升级after the secure connection is established:
- 醇>
如果/ secure /为true,客户端必须执行TLS握手 打开连接后和发送前的连接 握手数据[RFC2818]。如果失败(例如服务器的话) 证书无法验证),然后客户端必须失败 WebSocket连接并中止连接。除此以外, 这个频道上的所有进一步沟通必须通过 加密隧道[RFC5246]。
客户端必须在TLS中使用服务器名称指示扩展 握手[RFC6066]。
在客户端,浏览器提供WebSocket
接口 - 当您到达onopen
事件时,握手已经完成。您可以将密钥放在protocol
中,但这肯定是一个黑客攻击(因为protocol
旨在用于实际注册的协议,而不是身份验证机制。)
另一种方法是将WebSocket包装在您自己的库中,该库处理第一条消息上的密钥交换,以便您的应用程序层不必担心细节。