You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中为Socket.io配置SSL安全连接?

无法建立安全WebSocket连接的排查与解决

问题背景

未启用SSL时Socket.io连接完全正常,但配置SSL后无法建立安全WebSocket连接。使用版本:Socket.io 4.6.2,Node.js 18.13.0。

非安全环境正常代码

服务器端

const http = require('http');
const { Server } = require('socket.io');

const port = 8025;

const httpServer = http.createServer((req, res) => {
    res.writeHead(200);
    res.end("Server is responding!");
})

const io = new Server(httpServer);

io.on('connection', (socket) => {
    socket.onAny((event, args) => {
        console.log('event:', event, 'args:', args);
        io.emit(event, args);
    });
});

httpServer.listen(port, () => {
    console.log(`Socket.io server running at http://localhost:${port}/`);
});

客户端

const io = require('socket.io-client');

const socket = io('ws://example.com:8025');

socket.on('message', (args) => {
    console.log('client args', args);
});

socket.emit('message', 'one message ' + Date.now());

SSL配置后异常代码

服务器端

const fs = require('fs');
const https = require('https');
const { Server } = require('socket.io');

const port = 8025;

const options = {
    key: fs.readFileSync('/etc/apache2/ssl/spl.audio.key.pem'),
    cert: fs.readFileSync('/etc/apache2/ssl/spl.audio.crt.pem'),
};

const httpsServer = https.createServer(options, (req, res) => {
    res.writeHead(200);
        res.end("Server is responding!");
})

const io = new Server(httpsServer);

io.on('connection', (socket) => {
    socket.onAny((event, args) => {
        console.log('event:', event, 'args:', args);
        io.emit(event, args);
    });
});

httpsServer.listen(port, () => {
    console.log(`Socket.io server running at https://localhost:${port}/`);
});

客户端

const io = require('socket.io-client');

const socket = io('wss://example.com:8025');

socket.on('message', (args) => {
    console.log('client args', args);
});

socket.emit('message', 'one message ' + Date.now());

排查与解决方案

1. 证书有效性检查

  • 确认证书文件路径正确,Node进程对证书文件有读取权限(可执行chmod 644调整权限)。
  • 检查证书是否绑定example.com域名,是否过期。可以用浏览器访问https://example.com:8025,查看证书提示信息。
  • 如果是自签名证书,需确保客户端信任该证书;测试环境可临时跳过验证,但生产环境必须使用可信CA签发的证书。

2. 客户端配置调整

若使用自签名证书,客户端需添加rejectUnauthorized: false参数(仅测试用):

const socket = io('wss://example.com:8025', {
  rejectUnauthorized: false
});

生产环境请将证书导入客户端系统的信任根库,或配置ca参数指定证书文件:

const socket = io('wss://example.com:8025', {
  ca: fs.readFileSync('/path/to/your/cert.pem')
});

3. 服务器端配置补充

如果证书由中间CA签发,需在options中添加中间证书:

const options = {
  key: fs.readFileSync('/etc/apache2/ssl/spl.audio.key.pem'),
  cert: fs.readFileSync('/etc/apache2/ssl/spl.audio.crt.pem'),
  ca: fs.readFileSync('/etc/apache2/ssl/intermediate-ca.pem') // 替换为实际中间证书路径
};

4. 网络与端口检查

  • 确认服务器8025端口已开放,防火墙/安全组允许HTTPS流量通过。
  • 测试服务器本地能否正常访问https://localhost:8025,排除网络层面问题。

5. 调试日志定位

服务器端添加错误监听:

httpsServer.on('error', (err) => {
  console.error('HTTPS Server Error:', err);
});

客户端添加连接错误监听:

socket.on('connect_error', (err) => {
  console.error('Connection Error:', err.message);
});
socket.on('disconnect', (reason) => {
  console.error('Disconnected:', reason);
});

通过日志信息精准定位问题,比如证书不匹配、连接超时等。

内容的提问来源于stack exchange,提问作者ArchibaldTuttle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:07:45