无法通过https从JavaScript客户端连接到websocket服务器

时间:2017-06-27 11:58:15

标签: javascript node.js websocket webrtc

我使用以下代码为我的webrtc app创建了websocket服务器

 const https = require('https');
const fs = require('fs');

const options = {
    key: fs.readFileSync('C:/.../key_store.key'),
    cert: fs.readFileSync('C:/.../key_store.crt')
};

var server = https.createServer(options, (req, res) => { res.writeHead(200); res.end('hello world\n');}).listen(9090);



//require our websocket library
var WebSocketServer = require('ws').Server;

//creating a websocket server at port 9090 
var wss = new WebSocketServer({server});

我的websocket客户端代码是:

conn = new WebSocket('ws://localhost:9090');

当我尝试使用上面的代码连接到websocket服务器时,我在JavaScript控制台中收到以下异常:

  

VM908:35 WebSocket连接到' ws:// localhost:9090 /'失败:在收到握手响应之前关闭连接

我尝试在chrome中导入证书但没有成功。

2 个答案:

答案 0 :(得分:1)

WebRTC要求https和https页面仅允许Secure Wecsockets(wss)连接。

所以你需要在客户端创建WebSocket,如下所示

conn = new WebSocket("wss://your_server_ip:wss_port/");
In your case:
conn = new WebSocket("wss://139.126.123.18:9090/");

我认为您在WebSocket服务器中使用自签名SSL证书(key_store.crt / .key)。
在这种情况下,浏览器会为这些连接引发ERR_INSECURE_RESPONSE例外 因此,我们通过在浏览器中访问该URL来手动添加异常。

在新标签页中打开https://139.126.123.18:9090/
然后点击Advanced - >继续(对于Chrome)。

或者您可以将自签名CA导出到浏览器。

现在您的Secure WebSocket应该已连接。

答案 1 :(得分:0)

尝试将代码更改为此类

const https = require('https');
const fs = require('fs');
const options = {
    key : fs.readFileSync('C:/.../key_store.key'),
    cert : fs.readFileSync('C:/.../key_store.crt')
};
var server = https.createServer(options).listen(9090);
//require our websocket library
var WebSocketServer = require('ws').Server;
//creating a websocket server at port 9090
var wss = new WebSocketServer({server});

// wait for connection to be established
wss.on('connection', (ws, req) => { 

    // send some message
    ws.send('hello world\n');

    // close connection
    ws.close(); 
});