wss 依赖底层 tls 加密,需通过直连模式(服务端加载证书私钥)或反向代理模式(如 nginx 配置 ssl_certificate 和 upgrade 头)实现,证书须由可信 ca 签发且域名严格匹配。

要让 WebSocket 使用 WSS(即加密的 wss:// 协议),核心不是单独配置一个叫 ssl_certificate 的字段,而是为整个 HTTPS 服务或 WebSocket 服务器提供有效的 SSL/TLS 证书和私钥文件,并确保服务监听在 443 端口或通过反向代理承接 HTTPS 流量。
确认你用的是哪种部署方式
WSS 本身不直接“配置证书”,它依赖底层传输层的安全支撑。常见有两类路径:
-
直连模式:WebSocket 服务自身集成 HTTPS(如 Node.js 的
ws库、Python 的websocket-server、Ratchet、Flask-SocketIO 等),需传入证书和私钥路径 - 反向代理模式:WebSocket 服务跑在普通 HTTP(如 8080 端口),由 Nginx 或 Apache 终止 SSL,再将升级后的连接代理过去——此时证书配在 Nginx/Apache 上,后端无需证书
直连模式:在代码中加载证书和私钥
以主流实现为例,关键都是把 .crt(或 .pem)证书文件和 .key 私钥文件读入并传给服务器构造函数:
-
Node.js + ws 库:
const https = require('https');<br> const { WebSocketServer } = require('ws');<br> const server = https.createServer({<br> cert: fs.readFileSync('/path/to/fullchain.pem'),<br> key: fs.readFileSync('/path/to/privkey.pem')<br> });<br> const wss = new WebSocketServer({ server }); -
Python websocket-server:
server = WebsocketServer(<br> host='0.0.0.0', port=9001,<br> cert='server.crt', key='server.key'<br> )
-
Ratchet(PHP):
$context = [<br> 'ssl' => [<br> 'local_cert' => '/etc/ssl/certs/your-domain.crt',<br> 'local_pk' => '/etc/ssl/private/your-domain.key'<br> ]<br> ];<br> $app = new App('example.com', 443, '0.0.0.0', null, $context);
反向代理模式:Nginx 上配置 ssl_certificate
这是生产环境更推荐的方式。Nginx 负责 SSL 终结,WebSocket 连接通过 Upgrade 头透传:
- 证书文件路径填在
ssl_certificate和ssl_certificate_key指令中 - 必须开启 WebSocket 支持的代理头设置
示例 Nginx 配置片段:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
证书准备与注意事项
无论哪种方式,证书都需满足基本要求:
- 使用正规 CA 签发的证书(如 Let's Encrypt、阿里云 SSL 证书),避免自签名证书用于生产环境
- 证书域名必须与客户端访问的
wss://xxx中的域名完全一致(含子域) - Let's Encrypt 的证书链通常需要合并为
fullchain.pem(证书 + 中间 CA),不能只用cert.pem - 私钥文件权限应设为
600,防止未授权读取











