【问题标题】:Serve two https hostnames from single node process & port从单节点进程和端口提供两个 https 主机名
【发布时间】:2014-11-15 03:08:28
【问题描述】:

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

【问题讨论】:

标签: javascript node.js ssl express https


【解决方案1】:

您只能使用 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');
});

【讨论】:

  • 所有现代浏览器都支持 SNI。如果有任何问题,它将与 IIS 7 之类的下层服务器和 Python 2.x 之类的下层客户端有关。顺便说一句,这是一个很好的例子。我想投票两次。 Node.js Manual 应该有那么好的东西。
  • FWIW 这个例子几乎来自节点的测试之一here,位于test/simple。对于您在文档或其他任何地方都找不到的场景示例,这些测试可以作为很好的参考。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 2020-10-31
  • 2019-07-04
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多