¿Hay alguna forma de ejecutar vhosts en Express con https? Mi código actual (no SSL) se ve así:
var express = require('express'); var vhost = require('vhost'); var path = require('path'); var appOne = express(); var appTwo = express(); var appVhosts = module.exports = express(); appOne.use(express.static(path.join(__dirname, 'pages'))); appTwo.get('/', function(req, res){ res.send('That service isn\'t up right now!') }); app.use(vhost('siteone.com', appOne)); app.use(vhost('sitetwo.com', appTwo)); appVhosts.listen(80);Sin embargo, que yo sepa, el módulo https solo acepta un certificado SSL.
Aparentemente, https.Server hereda de tls.Server , que ofrece un método llamado addContext() . Puede configurar varios certificados allí. También escribí un paquete muy pequeño que usa este método para lograr el resultado, https://www.npmjs.com/package/vhttps . Puedes consultar mi implementación allí.
Debe definir las opciones de SSL para cada aplicación y asignarlas a cada aplicación de la siguiente manera:
// (A) read SSL files var fs = require('fs'); var appOneSSLOps = { key: fs.readFileSync('./path_to_file/private.key'), cert: fs.readFileSync('./path_to_file/certificate.crt') } var appTwoSSLOps = { key: fs.readFileSync('./path_to_file/private2.key'), cert: fs.readFileSync('./path_to_file/certificate2.crt') } // (B) assign SSL files to app var https = require('https'); var appOneServer = https.createServer(appOneSSLOps , appOne).listen(443); var appTwoServer = https.createServer(appTwoSSLOps , appTwo).listen(80); // (C) route 80 to 443 - > on your machine route port 80 to 443 either manually or by child_process: I assume you are using linux Ubuntu System childProcess = require('child_process'); var optionExec = {timeout: 3000}; //option(s) for childProcess.exec childProcess.exec( 'sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 443', optionExec, function(err, stdout, stderr) { } ); // (D) then enforce SSL - I assume appOne is the main app. appOne.use(function(request, response, next) { if(!request.secure) { response.redirect('https://' + request.headers.host + request.url); } next(); }); Nota: supongo que appOne es la aplicación principal.