简体   繁体   English

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

[英]Unable to connect to websocket server over https from JavaScript client

I have created websocket server for my webrtc app using the following code 我已经使用以下代码为我的webrtc应用创建了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});

My websocket client code is : 我的websocket客户端代码是:

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

I am getting the following exception in JavaScript console when I am trying to connect to websocket server using the above code: 当我尝试使用上述代码连接到websocket服务器时,在JavaScript控制台中出现以下异常:

VM908:35 WebSocket connection to 'ws://localhost:9090/' failed: Connection closed before receiving a handshake response VM908:35 WebSocket与'ws:// localhost:9090 /'的连接失败:连接已收到握手响应之前关闭

I tried importing certificates in chrome but with no success. 我尝试导入Chrome中的证书,但没有成功。

WebRTC requires https and https pages allow Secure Wecsockets (wss) connections only. WebRTC要求使用https,而https页面仅允许安全Wecsockets(wss)连接。

So you need to create WebSocket in the client side as follows 因此,您需要按如下所示在客户端中创建WebSocket

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

I think you are using self signed SSL certificates(key_store.crt/.key) in your WebSocket Server. 我认为您在WebSocket服务器中使用的是自签名SSL证书(key_store.crt / .key)。
In that case browsers will raise ERR_INSECURE_RESPONSE exception for those connections. 在这种情况下,浏览器将为这些连接引发ERR_INSECURE_RESPONSE异常。
So we have add exception manually by accessing that url in browser as following. 因此,我们可以通过以下方式在浏览器中访问该网址来手动添加例外。

Open https://139.126.123.18:9090/ in new tab, 在新标签页中打开https://139.126.123.18:9090/
Then click on Advanced -> proceed (for Chrome). 然后点击高级->继续(对于Chrome)。

Or you can export your self signed CA to browsers. 或者,您可以将自签名的CA导出到浏览器。

Now your Secure WebSocket should get connected. 现在,您的Secure WebSocket应该已连接。

Try to change your code to something like this 尝试将您的代码更改为这样的内容

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(); 
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM