代理安全WebSocket向wss连接发送自签名证书时连接报错问题
问题修复方案
根因分析
- 你当前8080端口启动的是普通HTTP服务,没有配置SSL证书,客户端用HTTPS/WSS协议访问HTTP端口,自然会触发SSL协议不匹配的报错,也就是你看到的
ssl3_get_record:wrong version number错误。 createProxyMiddleware里的ssl配置项不是用来给代理自身配置服务端证书的,是用来配置代理向后端发起请求时用的客户端证书,你的场景不需要配这个;secure: true代表代理会严格校验后端8443服务的自签名证书,你需要额外指定信任的CA证书才不会校验失败。
修复步骤
1. 修改代理端代码
首先把代理服务改成HTTPS服务,同时补全代理校验后端证书的CA配置,修改后的代码如下:
const wsProxy = createProxyMiddleware('/', { target: `https://localhost:8443`, changeOrigin: true, secure: true, ws: true, // 新增:指定信任的后端CA证书,解决自签名证书校验失败问题 ca: fs.readFileSync(path.resolve(__dirname, 'cert.pem')), }); const app = express(); app.use(wsProxy); // 改为用HTTPS启动代理服务,配置和后端一致的证书密钥 const proxy = https.createServer({ cert: fs.readFileSync(path.resolve(__dirname, 'cert.pem'), 'utf-8'), key: fs.readFileSync(path.resolve(__dirname, 'server.key'), 'utf-8') }, app).listen(8080); proxy.on('upgrade', wsProxy.upgrade);
2. 验证修复效果
- 浏览器访问
https://localhost:8080,信任自签名证书后即可正常看到返回内容 - 运行
wscat -c wss://localhost:8080 --ca cert.pem即可正常建立WSS连接
内容的提问来源于stack exchange,提问作者azlan_909
相关产品推荐
相关产品推荐

