WebSocket(ws vs wss)长连接协议
wss 必须有 SSL/TLS 证书,ws 不需要。
WebSocket 协议本身只是一个在 HTTP 之上的升级协议。客户端先发一个 HTTP 请求:
Upgrade: websocket
Connection: Upgrade
服务器同意后,连接升级为双向长连接。
区别
ws://= 明文 WebSocketwss://= 基于 TLS 的 WebSocket(就像 https)
所以:
- ws 走 TCP 明文
- wss 走 TLS 加密隧道
这和 HTTP / HTTPS 的关系是完全类比的。WebSocket 没有重新发明加密,它直接复用了 TLS。
如果你用 wss://,浏览器会要求:
- 有合法的 SSL 证书
- 域名匹配证书
- 证书链可信(受信任 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