应升级:TLS后跟升级:端口80上的h2c / websocket仍然是安全的吗?

时间:2017-04-13 08:36:08

标签: http ssl websocket http2

https://en.m.wikipedia.org/wiki/HTTP/1.1_Upgrade_header

鉴于以下内容:

  • 在端口80上连接
  • 请求Upgrade: TLS/1.x
  • 请求Upgrade: h2cUpgrade: websocket

结果连接/协议是否仍在使用TLS,还是由不安全的替换

注意:我不是主要寻找流行客户端/服务器的当前状态,而是寻找规范中可能导致更理想实现的任何提示。

1 个答案:

答案 0 :(得分:0)

我不确定您的请求是否有意义,即使有,但是如果有任何实施可以支持它 - 或者您是否可以依赖可能的支持。

i = 0;

while (fscanf(sp_input, "%d", &test[i]) == 1) {
    i = i + 1;
}

// Now, i is the number of items in the list, and test[0] .. test[i-1]
// are the items.

好的,这很好。它基本上会要求通过端口80和http来说TLS,并由RFC-2817定义。它非常不寻常,因为标准是仅通过https方案和端口443(或非标准端口,如8443)来讲TLS,但理论上这可行。另请注意,Connect on port 80 Request Upgrade: TLS/1.x 标头也必须设置为Connection

Upgrade

这是它开始变得棘手的地方。 h2c协议是一个不安全的HTTP / 2连接(即没有TLS),但是,与你的第一个标头相结合,你要求它超过TLS(通过HTTP btw允许多个标头)。我想,从理论上讲,这个可以工作,类似于它在上面的HTTP / 1.1下的工作方式,除了HTTP/2 spec明确指出:

  " h2c"协议标识符描述了不使用TLS的协议。

  

通过TLS支持HTTP / 2的实现必须在TLS [TLS-ALPN]中使用协议协商。

因此,我认为上述连接违反规范并且未确认升级。

Connect on port 80
Request Upgrade: TLS/1.x
Request Upgrade: h2c

websocket spec对此不太清楚。它确实说明了:

  

默认情况下,WebSocket协议使用端口80进行常规WebSocket连接,将端口443用于通过传输层安全性(TLS)[RFC2818]进行隧道传输的WebSocket连接。

还有:

  

A | wss | URI标识WebSocket服务器和资源名称,并指示通过TLS保护该连接上的流量(包括TLS的标准优势,如数据机密性和完整性以及端点身份验证)。

然而,我无法看到禁止通过| ws |进行TLS连接URI,甚至使用| wss |端口80上的URI。但是我想,由于没有明确定义,因此不能保证这是否有效,或者连接是否安全。