javascript - 从单 Node 进程和端口提供两个 https 主机名

标签 javascript node.js ssl express https

有没有一种方法可以单独从 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/

相关文章:

javascript - 为什么我不能同时使用 javascript 数组 rest 解构?

javascript - 传单中的标签问题

node.js - Less 不会编译为 nodejs 中间件

visual-studio-2012 - 每个 X.509 v3 证书都可以用作验证码证书吗

windows - 在 Windows 上对 HTTPS URL 运行 wget 时如何修复证书错误?

javascript - 如何使用函数动态设置 img src

node.js - 我可以直接在node.js上的Heroku中使用imagemagick吗

node.js - 为什么我必须一次又一次地运行 "webpack"命令?

node.js - 由于使用代理,Git 和 NPM 失败

javascript - Bootstrap datepicker 触发器更改