WSS本质是WebSocket运行在TLS加密通道上,需浏览器强制校验可信CA证书、域名匹配、TLS 1.2+支持;前端只需正确书写wss://URL,证书校验与TLS配置由浏览器和服务端共同完成,Nginx反代必须配齐proxy_http_version 1.1、Upgrade和Connection头。

WSS 不是给 WebSocket 单独加个参数就能启用的协议,而是让 WebSocket 运行在 TLS 加密通道上——本质和 HTTPS 一样。浏览器强制要求:只要页面是 HTTPS,所有 WebSocket 子资源必须用 wss://;且证书必须由可信 CA 签发、域名严格匹配、链完整、支持 TLS 1.2+。客户端(JavaScript)本身不配置证书,也不处理校验逻辑,所有校验由浏览器自动完成。
前端只需写对 URL,其他交给浏览器
JavaScript 中创建 WSS 连接,代码极其简单:
- 确保 URL 域名与证书 SAN(Subject Alternative Name)完全一致,比如证书签的是
ws.example.com,就不能用www.example.com或 IP 地址 - 不要带端口号(除非非 443),否则需显式写出:
wss://ws.example.com:8443 - 禁止使用自签名证书或 Let’s Encrypt 签发的纯 IP 证书——浏览器直接拒绝,控制台报
ERR_CERT_AUTHORITY_INVALID或NET::ERR_CERT_COMMON_NAME_INVALID - 若走 Nginx 反代,URL 仍写
wss://ws.example.com,不必暴露后端真实地址
服务端必须正确支撑 TLS 层(关键在后端,不在 JS)
浏览器只管发起连接并验证证书,真正决定能否握手成功的,是服务端是否提供了合规的 TLS 通道。常见两种方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
直连模式(如 Node.js + ws 库):用
https.createServer({ cert, key })启动 HTTPS 服务,再把WebSocketServer挂载其上;cert必须是fullchain.pem(含根+中间证书),key必须是未加密私钥,权限设为600 -
Nginx 反向代理模式(推荐生产环境):Nginx 终止 SSL,后端跑普通
ws://localhost:3000;必须配齐三要素:proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade",缺一不可
证书校验失败的典型表现和排查方向
浏览器报错不是“证书配置错了”,而是“TLS 握手没成功”。常见现象及对应原因:
立即学习“Java免费学习笔记(深入)”;
-
WebSocket connection to 'wss://...' failed+ 网络面板显示状态码 200(不是 101)→ Nginx 没透传 Upgrade 头,请求被当普通 HTTP 处理 -
net::ERR_SSL_PROTOCOL_ERROR→ 服务端 TLS 配置错误(如用了 TLSv1.0、证书格式不对、私钥加密了) -
net::ERR_CERT_COMMON_NAME_INVALID→ 证书域名和 URL 不匹配,或证书没包含该域名的 SAN -
net::ERR_CERT_AUTHORITY_INVALID→ 自签名证书、内部 CA 未导入系统信任库、或 Let’s Encrypt 中间链缺失(检查是否用了fullchain.pem)
微信小程序、iOS Safari 等特殊环境注意点
这些平台校验更严,容易踩坑:
- 微信真机调试报
errCode: 1004, errMsg: TLS handshake failed→ 几乎一定是证书链不全或 TLS 版本过低,Nginx 需明确写ssl_protocols TLSv1.2 TLSv1.3; - iOS Safari 拒绝连接 → 常因只传了
cert.pem没传fullchain.pem,导致中间证书缺失 - 不能用
localhost或127.0.0.1测试 WSS → 浏览器不认这类域名的证书,必须用真实备案域名

















