从单节点进程提供两个https主机名&港口城市

Serve two https hostnames from single node process & port

本文关键字:https 主机 amp 港口城市 两个 节点 单节点 进程      更新时间:2023-09-26

有没有一种方法可以单独从节点为同一端口上的两个https站点提供服务(即没有类似nginx的东西)?

我使用的是https模块,它的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选项,但我不确定这是否可行。

您只能使用SNI执行此操作,因此您可能需要首先检查各种浏览器是否支持SNI。

以下是在节点中进行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');
});