繁体   English   中英

如何使用 express 设置 HTTPS 服务器

[英]how to set up a HTTPS server using express

我有一个使用 express 的应用程序。

我有一个 http 服务器正在运行,但我想使用 https 服务器来提高安全性。

我已经使用 openssl 生成了我的 selfsigned.crt 证书和密钥 selfsigned.key (我在 windows 上,我正在使用 Visual Studio 代码)。 但是,经过几个小时的尝试,我没有成功。

我检查了很多网站,它似乎可行,但我做不到。 (我的项目名称叫做 carsapp,这就是为什么你会看到它出现在 www 文件中的原因)

我的 app.js 文件:

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');


var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');


var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});




module.exports = app;

在我的 bin 目录中的 www 文件:

#!/usr/bin/env node

/**
 * Module dependencies.
 */

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


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

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

/**
 * Create HTTP server.
 */

 var server = http.createServer(app);




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

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

/**
 * 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);
}

如您所见,http 服务器运行良好,但我尝试了 https 但我不能,所以这是我在尝试 https 之前的代码。

您可以通过包含 https 库来启用 https,然后将所需的证书作为选项传递,以及快速应用程序。

const https = require('https');
const fs = require('fs');
const app = require('../app');

const options = {
  key: fs.readFileSync('./keyFile.key'),
  cert: fs.readFileSync('./certFile.crt')
};

const server = https.createServer(options, app);
server.listen(8000);

在旁注中,我碰巧同意@Quentin。 如果这个应用程序面向世界,您可能需要认真考虑使用反向代理。

我建议对 bin 文件夹中的“www”文件进行这些更改...

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('carsapp:server');
var https = require('https'); // <--- change to https
var fs = require('fs'); // <--- for loading the certificates

/** Load the certificate and key files using 'fs' */
const options = {
  key: fs.readFileSync('./keyFile.key'),
  cert: fs.readFileSync('./certFile.crt')
};

// The createServer function takes an extra argument.
var server = https.createServer(options, app);

// (continue with the rest of your code)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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