NodeJS - 使用协议 HTTPS 建立连接 WebSocket

Posted

技术标签:

【中文标题】NodeJS - 使用协议 HTTPS 建立连接 WebSocket【英文标题】:NodeJS - Establish a Connection WebSocket with protocol HTTPS 【发布时间】:2021-01-27 14:06:46 【问题描述】:

我的 HTTPS 和 WebSocket 连接有问题(我使用 Node.JS 作为服务器)。 我已经使用 OpenSSL 生成了 SSL 证书,并使用以下代码将它们导入服务器:

const https = require('https');
var app = express();
...
const WebSocket = require('ws');
...
var serverHttps = https.createServer(
        key: fs.readFileSync(path.join(pathCertificati, 'key.pem')),
        cert: fs.readFileSync(path.join(pathCertificati, 'cert.pem'))
    , app).listen(3000, () => 
    console.log('In ascolto sulla porta 3000 HTTPS.')
    )

const wss = new WebSocket.Server(
    server: serverHttps, 
    adress: '192.168.12.40',
    port: 9000
);

有了这段代码,我应该有一个 WebSocket 来处理 HTTPS 连接,对吗?

客户端,我有以下代码:

socket = new WebSocket("wss://192.168.12.40:9000");
socket.onopen = function ()...
socket.onclose = function ()...
socket.onerror = function (error) 
        console.log("Errore nella connessione!");
        console.log(error);
    

当我使用地址:https://192.168.12.40:3000加载页面并执行上述代码时,出现错误消息:

WebSocketScript.js:26 WebSocket 连接到“wss://192.168.12.40:9000/”失败:连接建立错误:net::ERR_SSL_PROTOCOL_ERROR

您有什么想法可以在 HTTPS 页面上建立 WebSocket 连接吗? 非常感谢。

【问题讨论】:

【参考方案1】:

我已经找到了问题的解决方案。解决办法是:

服务器端代码:

var serverHttps = https.createServer(
        key: fs.readFileSync(path.join(pathCertificati, 'key.pem')),
        cert: fs.readFileSync(path.join(pathCertificati, 'cert.pem'))

    , app).listen(3000, () => 
        // Messaggio di attivazione del server in ascolto sulla porta 3000
        console.log('Listening ' + 3000 + ' HTTPS.');
    )

serverHttps.on('upgrade', function upgrade(request, socket, head) 
    const pathname = url.parse(request.url).pathname;

    if (pathname === "/") 
        wss.handleUpgrade(request, socket, head, function done(ws) 
            wss.emit('connection', ws, request);
        );
    
);

// Create WebSocket
const wss = new WebSocket.Server( noServer: true );

wss.on('error', function () ...
wss.on('connection', function (ws) ...

客户端:

socket = new WebSocket("wss://192.168.12.40:3000);

这与服务器端使用的地址相同,它会触发事件“serverHttps.on('upgrade'

感谢日志...

【讨论】:

以上是关于NodeJS - 使用协议 HTTPS 建立连接 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

nodejs-websocket介绍

使用nodejs同步建立elasticsearch连接

无法建立从工作台到 nodejs 的本地 mysql 连接

Android上HTTPS连接的未知协议错误

HTTPS 协议

Nodejs 无法在 ws:// apache 代理服务器上建立连接