Express的多个证书/虚拟主机

在Cody-CMS中使用Express +虚拟主机,现在我已经使用了多个主机的nodejs。 现在我想包括虚拟HTTPS服务器。

SNICallback被调用,但它结束在那里…我的Express应用程序“exp”永远不会被调用(即使我使用一个简单的函数在注释中将其replace为createServer)。 我得到“请求:site1.com”(或site2.com),但没有任何返回给浏览器。

对于http服务器来说,它是完美的。

任何帮助是受欢迎的。

"use strict"; var express = require("express"); var vhost = require("vhost"); var fs = require("fs"); var app1 = express(); app1.all("/", function(req, res) { res.send('Hello World, site #1'); }); var app2 = express(); app2.all("/", function(req, res) { res.send('Hello World, site #2'); }); ////////////////// // certificates // ////////////////// var crypto = require('crypto'); const site1 = { app: app1, context: crypto.createCredentials({ key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() }).context }; const site2 = { app: app2, context: crypto.createCredentials({ key: fs.readFileSync('ws2.key').toString(), cert: fs.readFileSync('ws2.crt').toString() }).context }; var sites = { "www.site1.com": site1, "site1.com": site1, "www.site2.com": site2, "site2.com": site2 }; // put (www.)site1/2.com in /etc/hosts to 127.0.0.1 ////////// // http // ////////// var exp = express(); for (let s in sites) { console.log("http -> " + s); exp.use(vhost(s, sites[s].app)); } exp.listen(80, function () { console.log("Listening https on port: 80") }); /////////// // https // /////////// var secureOpts = { SNICallback: function (domain) { console.log('request for: ', domain); return sites[domain].context; }, key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() }; var https = require('https'); var httpsServer = https.createServer(secureOpts, exp); // var httpsServer = https.createServer(secureOpts, function(req, resp) { resp.send("hello"); }); httpsServer.listen(443, function () { console.log("Listening https on port: 443") }); 

SNICallback有第二个参数: cbcb的签名是(error, context) 。 所以你的secureOpts应该是这样的:

 var secureOpts = { SNICallback: function(domain, cb) { console.log('request for: ', domain); cb(null, sites[domain].context); }, key: fs.readFileSync('ws.key').toString(), cert: fs.readFileSync('ws.crt').toString() };