我正在尝试构建一个小的websocket应用程序。我试图在已经运行在安全HTTPS协议上的网站上实现它,因此websocket必须在wss
上才能工作。
我使用以下代码构建服务器:
var express = require('express');
var app = express();
var fs = require('fs');
var key = fs.readFileSync('/etc/apache2/ssl/www.bigriss.com_private_key.key');
var cert = fs.readFileSync( '/etc/apache2/ssl/www.bigriss.com_ssl_certificate.crt' );
var ca = fs.readFileSync( '/etc/apache2/ssl/bigriss.com_ssl_certificate_INTERMEDIATE.crt' );
var options = {
key: key,
cert: cert,
ca: ca
};
var https = require('https').createServer(options, app);
var io = require('socket.io')(https);
var port = process.env.PORT || 8080;
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket){
socket.on('chat message', function(msg){
var token = socket.handshake.query.token;
io.emit('chat message', msg + token);
});
});
https.listen(port, function () {
console.log('listening on *:' + port);
});
在我看来,这是一个非常简单和标准的实现。我可以正确访问网址https://example.com:8080,并提供在index.html
读取的内容。在这个html文件中,我尝试使用以下方法建立连接:
var socket = io.connect('https://bigriss.com:8080/?token=abc', {
transports: ['websocket'],
upgrade: false,
secure: true,
reconnect: true,
rejectUnauthorized : false
});
玩了好几次选项。无论如何,我在Chrome控制台中收到错误:
failed: Connection closed before receiving a handshake response
failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
在终端中,我收到以下节点错误:
nodejs: ../src/util-inl.h:196: TypeName* node::Unwrap(v8::Local<v8::Object>) [with TypeName = node::TLSWrap]: Assertion `(object->InternalFieldCount()) > (0)' failed.
Aborted
我已经使用HTTP测试了这个相同的设置,它可以正常工作。 HTTPS中缺少什么特别的东西?