从单节点进程和服务器提供两个https主机名。港口

时间:2014-09-20 18:56:55

标签: javascript node.js ssl express https

有没有办法在单独节点的同一端口上提供两个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选项,但我不确定这是否可行。

1 个答案:

答案 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');
});