【发布时间】:2019-06-06 16:19:00
【问题描述】:
为了测试 JavaScript / html5 应用程序,我使用 node.js 和 ws package 创建了一个本地 WebSocketServer。我想通过 SSL/TLS 使用安全 websockets (wss)。
密钥和证书由 OpenSSL 在本地创建用于测试目的(自签名证书)。
客户端只是尝试使用本机 WebSocket 对象连接到(本地)https 服务器:
var ws = new Websocket('wss://localhost:8080');
问题是,没有浏览器(Firefox、Chrome、Edge)可以连接到服务器,它们都给我不同的错误消息。
火狐:
Firefox 无法连接到 wss 的服务器:// localhost: 8080 /。
铬:
ws_client.js:7 WebSocket 连接到 'wss://localhost:8080/' 失败: 连接建立错误: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 服务器有效,但我想尽可能真实地测试应用程序并且使用安全连接。)
【问题讨论】:
-
您也可以尝试使用 127.0.0.1:8080 代替 localhost
标签: javascript node.js ssl networking websocket