将WebSockets升级到TLS

时间:2016-10-16 17:39:50

标签: http redirect ssl websocket http-status-code-301

对于HTTP,可以使用301响应将所有请求升级到HTTPS。

然而,对于websocket,它似乎并不那么容易。如果我将ws://127.0.0.1请求重定向到wss:/127.0.0.1,我在浏览器中使用websocket.org上的测试得到“错误:未定义”(是的,证书是可信的,适用于wss如果直接使用)。发出初始请求,并发送重定向。但是,TLS端口上没有第二个请求。

规范仅涵盖重定向。

  • 是否可以升级ws?
  • 即使使用重定向响应,是否还需要发送特定于WebSocket的标头? (目前,我没有 - 并且规范列出了在完成握手之前重定向)
  • 我想念的任何其他事情?

2 个答案:

答案 0 :(得分:1)

这取决于webSocket客户端实现是否处理3xx状态代码。 webSocket specification不需要客户端实现。以下是该规范的引用:

  

如果从服务器收到的状态代码不是101,那么          客户端处理每个HTTP [RFC2616]过程的响应。在          特别是,客户端可能会执行身份验证          收到401状态代码;服务器可能会重定向客户端          使用3xx状态代码(但客户不需要遵循          否则,按以下步骤进行操作。

答案 1 :(得分:1)

  

对于HTTP,可以使用301响应将所有请求升级到HTTPS。

(挑剔)这不是对请求的升级,而是重定向导致不同的请求。

  

是否可以升级ws?

根据websocket standard (RFC 6455)

  

如果从服务器收到的状态代码不是101,那么          客户端处理每个HTTP [RFC2616]过程的响应。在          特别是,客户端可能会执行身份验证          收到401状态代码; 服务器可能会重定向客户端          使用3xx状态代码(但客户不需要遵循          他们)

所以是的,它可能会得到一些客户的支持,但不受其他客户的支持。例如,在Firefox中,相关属性network.websocket.auto-follow-http-redirects默认为false,即默认情况下不会遵循重定向。

  

即使使用重定向响应,是否还需要发送特定于WebSocket的标头?

这些仅与将请求升级到websocket而非重定向有关。这意味着标头只应在升级响应中发送(状态码101)。