有没有办法在单独节点的同一端口上提供两个https站点(即没有像nginx这样的东西)?
我正在使用https module,其中SSL选项(例如key
/ cert
/ ca
)会传递到createServer
。我尝试创建两个https服务器,每个服务器都监听不同的主机名,每个服务器都有特定于该主机名的SSL选项:
require('https').createServer(sslOptsForFoo, expressApp).listen(443, 'foo.com');
require('https').createServer(sslOptsForBar, expressApp).listen(443, 'bar.com');
但这会引发错误:
错误:听EADDRINUSE
另一个想法是创建一个服务器而不是两个服务器,并根据请求的主机名使用不同的SSL选项,但我不确定这是否可行。
答案 0 :(得分:5)
您只能使用SNI执行此操作,因此您可能需要先检查SNI support with various browsers。
这是在节点中进行SNI的一种方法:
var https = require('https'),
fs = require('fs');
// default for non-matching requests
var serverOptions = {
key: fs.readFileSync('default.pem'),
cert: fs.readFileSync('default.crt')
};
var SNIContexts = {
'foo.com': {
key: fs.readFileSync('foo.com.pem'),
cert: fs.readFileSync('foo.com.crt')
},
'bar.com': {
key: fs.readFileSync('bar.com.pem'),
cert: fs.readFileSync('bar.com.crt')
}
};
var server = https.createServer(serverOptions, function(req, res) {
res.end('Hello world via ' + req.socket.cleartext.servername);
});
server.addContext('foo.com', SNIContexts['foo.com']);
server.addContext('bar.com', SNIContexts['bar.com']);
server.listen(443, function() {
console.log('Listening on 443');
});