简体   繁体   中英

NodeJs HTTPS connection with express generator

I've created an app using the express generator which all works okay but I now want to run the app with HTTPS, I've tried to configure the node server file in /bin/www to the following:

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var debug = require('debug')('****:server');
var https = require('https');
var fs = require('fs');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3001');
app.set('port', port);


var options = {
    path: '../app',
    port: 443,
    key: fs.readFileSync('/var/www/vhosts/keys/wildcard.****.com.key'),
    cert: fs.readFileSync('/var/www/vhosts/keys/wildcard.****.com.crt')
}


/**
 * Create HTTPS server.
 */

var server = https.createServer(options);

But I can no longer access my app when pointing it to https://

try this out:

 var express = require('express'); var https = require('https'); var http = require('http'); var fs = require('fs'); // This line is from the Node.js HTTPS documentation. var options = { key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'), cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert') }; // Create a service (the app object is just a callback). var app = express(); // Create an HTTP service. http.createServer(app).listen(80); // Create an HTTPS service identical to the HTTP service. https.createServer(options, app).listen(443);

and create a self-signed certificate. How ? follow this link http://docs.nodejitsu.com/articles/HTTP/servers/how-to-create-a-HTTPS-server

I solved this issue modifing after creation with express-generator the bin/www file and renamed it as wwws. Then in package.json I change the "source" attribute pointing the new script.

...
"scripts": {
    "start": "node ./bin/wwws"
  },
...

In wwws I use an https server instead of an http and then I redirect the http requests. Here my new wwws file. I removed the http lines in the middle of www file and I added the new server section at the end.

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('phishsense:server');
var http = require('http');

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

/**
 * Event listener for HTTP server "error" event.
 */

function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }

  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;

  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}

/**
 * Event listener for HTTP server "listening" event.
 */

function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}


// Add HTTPS Section
var fs = require('fs');
var https = require('https');
var http_port = normalizePort(process.env.PORT || '8080');
var https_port    =   process.env.PORT_HTTPS || 8443; 
var options = {
 key  : fs.readFileSync('server.key'),
 cert : fs.readFileSync('server.crt')
};

app.set("port",https_port);

/*
° Create HTTPS server.
*/ 
server = https.createServer(options, app).listen(https_port, function () {
 console.log('Magic happens on port ' + https_port); 
});

/**
* Listen on provided port, on all network interfaces.
*/

server.listen(https_port);
server.on('error', onError);
server.on('listening', onListening);

// Redirect from http port to https
http.createServer(function (req, res) {
  res.writeHead(301, { "Location": "https://" + req.headers['host'].replace(http_port,https_port) + req.url });
  console.log("http requet, will go to >> ");
  console.log("https://" + req.headers['host'].replace(http_port,https_port) + req.url );
  res.end();
}).listen(http_port);

This works for me and lets the structure created by express-generator untouched.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM