有没有一种方法可以单独从 Node (即没有 nginx 之类的东西)在同一端口上为两个 https 站点提供服务?
我正在使用 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');
但这会引发错误:
Error: listen EADDRINUSE
另一个想法是创建一个服务器而不是两个,并根据请求的主机名使用不同的 SSL 选项,但我不确定这是否可行。
最佳答案
您只能使用 SNI 执行此操作,因此您可能需要检查 SNI support with various browsers首先。
这是在 Node 中执行 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');
});
关于javascript - 从单 Node 进程和端口提供两个 https 主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25952255/