wss配置成功的核心是客户端能正常连接wss://地址且无证书或连接错误;nginx反向代理模式下需正确设置ssl_certificate(如fullchain.pem)、ssl_certificate_key(如privkey.pem),并添加proxy_http_version 1.1、proxy_set_header upgrade $http_upgrade、proxy_set_header connection "upgrade"三行关键配置。

WSS 不是单独“配个证书”就能通的,它依赖整个 TLS 通道是否真正建立成功。核心判断只有一条:客户端能连上 wss:// 地址,且浏览器控制台没有 net::ERR_CONNECTION_REFUSED 或 net::ERR_CERT_AUTHORITY_INVALID 这类错误,才算配置到位。
nginx 反向代理模式下 ssl_certificate 怎么写
这是生产环境最常用、也最推荐的方式:WebSocket 服务本身跑在 HTTP(比如 localhost:8080),由 nginx 终止 SSL 并代理升级请求。此时证书完全由 nginx 管理,后端无需任何证书文件。
-
ssl_certificate必须指向完整的证书链文件(含服务器证书 + 中间 CA),常见路径如/etc/letsencrypt/live/yourdomain.com/fullchain.pem -
ssl_certificate_key指向私钥,如/etc/letsencrypt/live/yourdomain.com/privkey.pem - 必须显式启用 WebSocket 协议升级,否则连接会在握手阶段失败:
proxy_http_version 1.1、proxy_set_header Upgrade $http_upgrade、proxy_set_header Connection "upgrade"缺一不可 - 如果用宝塔面板,填完证书后别忘了进「配置文件」手动补上
location / { ... }块里的 upgrade 相关 header,它的默认模板常会漏掉
Node.js ws 库直连 HTTPS 服务时 cert 和 key 怎么读
当你的 WebSocket 服务直接监听 443 端口(不经过 nginx),就得在代码里加载证书。这里不是传路径字符串,而是要同步读取内容并传给 https.createServer()。
WebSocket 8.18.2 是该协议规范的一个重要迭代版本,主要优化了连接稳定性与数据传输效率。它通过全双工通信机制,允许客户端与服务器在单一长连接上实时交换数据,大幅降低传统 HTTP 轮询的开销。该版本增强了心跳保活、自动重连及二进制帧传输能力,适用于即时通讯、在线游戏及金融行情推送等低延迟场景,为开发者提供更可靠的实时网络交互基础。
- 不能写成
cert: '/path/to/cert.pem'—— 这会报Error: error:0909006C:PEM routines:get_name:no start line - 必须用
fs.readFileSync()读取二进制内容,例如:cert: fs.readFileSync('/path/to/fullchain.pem') - 自签名证书开发时可临时加
rejectUnauthorized: false,但上线前务必删掉,否则客户端无法校验服务端身份 - 证书和私钥文件权限需为 600,否则
ws启动时可能静默失败,日志只显示listen EACCES
Websockify 启动时 --cert 参数报错怎么办
websockify 对证书格式敏感,尤其容易卡在 PEM 结构上。它不接受分开的 .crt + .key,也不接受带密码的私钥。
- 若用
openssl req -x509生成自签名证书,必须加-nodes参数,否则私钥被加密,websockify无法读取 - 推荐把证书和私钥合并成单个 PEM 文件:
cat cert.pem key.pem > combined.pem,然后用--cert=combined.pem - 启动时报
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER],大概率是客户端连了ws://却被--ssl-only拒绝,检查 URL 是否真的用了wss:// -
--ssl-version tlsv1_2是安全底线,不要用tlsv1,现代浏览器已弃用
最容易被忽略的一点:无论哪种方式,wss:// 的域名必须和证书的 Subject Alternative Name (SAN) 完全一致。用 IP 地址访问?证书里没写那个 IP?那必然触发 NET::ERR_CERT_COMMON_NAME_INVALID —— 这不是配置错了,是证书根本没覆盖这个访问入口。










