为了测试JavaScript / html5应用程序,我使用node.js和ws package创建了一个本地WebSocketServer。我想使用带有SSL / TLS的安全网络套接字(wss)。
密钥和证书是由OpenSSL在本地创建的(自签名证书)。
客户端仅尝试使用本机WebSocket对象连接到(本地)https服务器:
var ws = new Websocket('wss://localhost:8080');
问题是,否浏览器(Firefox,Chrome,Edge)可以连接到服务器,并且它们都给我不同的错误消息。
Firefox:
Firefox无法通过wss连接到服务器://本地主机:8080/。
Chrome浏览器:
ws_client.js:7与'wss:// localhost:8080 /'的WebSocket连接失败: 建立连接错误:net :: ERR_CERT_AUTHORITY_INVALID
边缘:
SCRIPT12017:SCRIPT12017:WebSocket错误:SECURITY_ERR,跨区域 不允许连接
我在OpenSSL(最新版本,最新版)中创建了证书和密钥:
openssl req -new -x509 -nodes -out server.crt -keyout server.key
我检查了有关此(和类似)主题的几乎所有问题,例如this question,但没有一个可以提供解决方案。
请不要将此问题标记为重复问题,因为所有相似的问题都包含略有不同的问题!
服务器代码:
var fs = require('file-system');
var pkey = fs.readFileSync('server.key', 'utf8');
var crt = fs.readFileSync('server.crt', 'utf8');
var credentials = { key: pkey, cert: crt };
var https = require('https');
var httpsServer = https.createServer(credentials);
httpsServer.listen(8080);
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
server: httpsServer
});
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('received: %s', message);
ws.send('reply from server : ' + message)
});
});
我尝试使用其他代码作为服务器,但是发生相同的错误:
const WebSocketServer = require('ws').Server;
var fs = require('file-system');
var ws_cfg = {
ssl: true,
port: 8080,
ssl_key: 'server.key',
ssl_cert: 'server.crt'
};
var processRequest = function(req, res) {
console.log('Request received');
};
var httpServ = require('https');
var app = httpServ.createServer({
key: fs.readFileSync(ws_cfg.ssl_key, 'utf8', (error) => {
console.log('Error reading file');
}),
cert: fs.readFileSync(ws_cfg.ssl_cert, 'utf8', (error) => {
console.log('Error reading file');
})
}, processRequest).listen(ws_cfg.port, function(){
console.log('Server running');
});
var wss = new WebSocketServer( {server: app, port: 8080, host: 'localhost', domain: 'localhost'} );
wss.on('connection', function (ws) {
console.log('Connected to a client');
ws.on('message', function (message) {
console.log('MSG received: ' + message);
});
});
还有一件事。总是,如果我在服务器代码中添加console.log(wss);
,则输出看起来像这样:
WebSocketServer {
domain: null,
...some more stuff...
...cert key etc....
host: null,
path: null,
port: null } }
主机,域和端口设置为null
。我尝试了所有将其设置为localhost:8080的方法,但没有任何结果。我认为这可能是所有问题的根源,但找不到办法。如果有人知道这个问题的答案,我将不胜感激。
(使用不安全的'ws'协议('ws:// localhost:8080')以便连接到本地node.js http服务器,但我想尽可能实际地测试该应用程序,使用安全的连接。)
答案 0 :(得分:0)
我想这个问题已经解决了。好吧,不是真的,但是对于本地测试应该没问题。
对于有相同问题的任何人,这是我所做的:
服务器代码应为:
const fs = require('fs'); //or 'file-System' , 'fs'-module is officially deprecated
const https = require('https');
const WebSocket = require('ws');
const server = new https.createServer({
cert: fs.readFileSync(localcert.cert'), //what ever you're files are called
key: fs.readFileSync('localkey.key')
});
const wss = new WebSocket.Server({ server }); // !
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
console.log('MSG received: %s', message);
});
ws.send('Hi to client');
});
server.listen(8080);
目前仅可在Google Chrome浏览器中使用,仍无法在Firefox中连接。
在Google Chrome浏览器中输入chrome://flags/#allow-insecure-localhost
并启用。
答案 1 :(得分:0)
尝试添加自签名证书或生成CA您正在使用的系统上是可信的。