我在一个提供有效证书的Web服务器上运行一个静态HTTPS页面。在我的页面上,有一个JavaScript创建了一个WebSocket连接。new WebSocket('wss://IpOfWebsocketServer');
WebSocket服务器接收到的第一件事是来自客户端的请求。但是请求本身是加密的!websocket服务器应该如何读取加密的请求?当一个web客户端连接到HTTPS页面时,会进行TLS握手,之后的所有内容都是加密的--发送到websocket服务器的请求也是加密的。但是单独运行的websocket服务器应该如何知道解密的密钥?wss websockets到底能不能运行?
当我使用HTTP和WS的时候,所有的东西(HTML页面和WebSocket服务器)都工作得很好,现在我必须切换到HTTPS和WSS。
1条答案
按热度按时间jq6vz3qz1#
WebSocket服务器接收到的第一件事是来自客户端的请求。但是请求本身是加密的!websocket服务器应该如何读取加密的请求?
与HTTPS服务器读取加密HTTP消息的方式完全相同。TLS会话是在客户端和服务器之间 * 在 * 交换任何应用程序数据之前建立的。TLS会话对接收到的任何数据进行解密,并对发送的任何数据进行加密。
因此,HTTPS客户端连接到HTTPS服务器,首先协商TLS会话,然后交换由该TLS会话加密/解密的HTTP消息。
WebSockets的情况也完全一样,WSS客户端连接到WSS服务器,首先协商TLS会话,然后使用HTTP消息(由TLS加密)协商WebSocket握手,然后交换后续的WebSocket消息(由TLS加密)。
当Web客户端连接到HTTPS页面时,会进行TLS握手,之后的所有内容都会加密
安全的WebSocket连接也会发生完全相同的情况。
但是单独运行的WebSocket服务器应该如何知道要解密的密钥呢?
它不知道HTTPS页面的TLS会话使用的原始密钥,也不需要知道,WebSocket客户端会和WebSocket服务器建立一个 * 单独 * 的TLS会话,有自己的密钥,只有WebSocket客户端和WebSocket服务器共享。
请注意,这与WebSocket客户端在WebSocket握手完成后发送到WebSocket服务器的每帧数据必须使用的每帧屏蔽密钥是分开的。该屏蔽密钥包含在每个帧中,即使没有使用TLS来加密客户端和服务器之间的底层连接,也始终使用该屏蔽密钥。
wss websockets到底能不能运行?
当然可以。