WebSocket(ws vs wss)长连接协议

wss 必须有 SSL/TLS 证书,ws 不需要。

WebSocket 协议本身只是一个在 HTTP 之上的升级协议。客户端先发一个 HTTP 请求:

Upgrade: websocket
Connection: Upgrade

服务器同意后,连接升级为双向长连接

区别

  • ws:// = 明文 WebSocket
  • wss:// = 基于 TLS 的 WebSocket(就像 https)

所以:

  • ws 走 TCP 明文
  • wss 走 TLS 加密隧道

这和 HTTP / HTTPS 的关系是完全类比的。WebSocket 没有重新发明加密,它直接复用了 TLS。

如果你用 wss://,浏览器会要求:

  1. 有合法的 SSL 证书
  2. 域名匹配证书
  3. 证书链可信(受信任 CA)

否则浏览器直接拒绝连接。

ws:// 不需要证书,因为它根本不加密。但问题来了——

如果你的页面是 https 打开的,而你试图连 ws,会发生什么?浏览器会拦截。
这叫 mixed content(混合内容)

也就是说

  • https 页面 → 只能连 wss
  • http 页面 → 可以连 ws 或 wss

这是浏览器的安全策略,不是 WebSocket 自己的限制。

生产环境里常见模式:

flowchart LR
    Client -->|wss| Nginx
    Nginx -->|ws| AppServer
  • TLS 在 Nginx 终止
  • 内网还是 ws
  • 证书只装在网关

从安全性角度说

ws 在公网 ≈ 裸奔
wss 在公网 ≈ 穿了防弹衣

不只是“数据会不会被看到”,还包括:

  • 会话劫持
  • 中间人攻击
  • Cookie / Token 被窃取
  • 企业代理劫持

如果系统里有认证 token,必须 wss。

WebSocket 握手阶段是 HTTP。
所以:

  • 如果你有 WAF
  • 有 CDN
  • 有七层负载

它们都要支持 WebSocket Upgrade。

总结

  • 开发测试内网:ws 足够
  • 上公网:默认 wss
  • https 页面:只能 wss
  • 企业环境:必须 wss