ws和wss之间有什么区别?

92

如何将ws更改为wss?

wss是通过普通HTTP进行升级还是仅在HTTPS上工作?

webSocket = new WebSocket("ws://localhost:port/Esv/ocp");

当我将ws更改为wss时,它可以正常工作。

webSocket = new WebSocket("wss://localhost:port/Esv/ocp");

出现了以下错误:

连接建立时出错:net::ERR_SSL_PROTOCOL_ERROR

1个回答

137

简短版

使用 SSL 还是不使用 SSL

你可能遇到了 SSL 证书问题。连接规则可以 概括为:

  • wss 只连接在 https
  • ws 只连接在 http

反过来也一样:

  • https 只接受 wss
  • http 只接受 ws

错误

以下情况将导致错误(在 Firefox 下进行测试):

  • 如果你想将 wss 连接到一个 http 端点. 在我的测试中,我得到了一个

    InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable

  • 如果你想将 ws 连接到一个 https 端点,你会得到这个错误

    SecurityError: The operation is insecure.

正式答案

Websocket 的圣经是 RFC 6455。在第 4.1.5 节:

如果/ secure /为真,则客户端必须在打开连接之后,发送握手数据之前进行TLS握手[RFC2818]。如果失败(例如,无法验证服务器的证书),则客户端必须“失败WebSocket连接”并中止连接。否则,在此通道上的所有进一步通信都必须通过加密隧道运行[RFC5246]。 secure标志由URI定义。第3节定义了什么是secure
如果您想使用 wss : - 必须启用SSL - 您的终端点必须受到保护( https:// ... ):不允许“安全降级” 如果您想使用 ws : - 确保您的终端点未启用SSL( http:// ...

谢谢。WSS对HTTP也能起作用吗? - mahe
1
不好意思,WebSocket 不允许“安全性”降级。我会编辑我的答案来强调这一点。感谢您指出。 - Al-un
@mahe,根据您的反馈,我更新了我的答案。它是否回答了您的问题? - Al-un
1
@mahe:连接WSS通过HTTP的唯一方法是使用一个中间WebSocket代理,该代理接受WSS/HTTPS并使用WS/HTTP进行转发。 - Remy Lebeau
所以无法通过HTTPS请求启动WebSocket吗?我们必须使用HTTP吗? - Juan Perez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接