简体   繁体   English

如何使用 express 设置 HTTPS 服务器

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

I have an application using express.我有一个使用 express 的应用程序。

I have a http server running but I would like to use a https server for more security.我有一个 http 服务器正在运行,但我想使用 https 服务器来提高安全性。

I already generated my selfsigned.crt certificate and the key selfsigned.key using openssl (I'm on windows and I'm using visual studio code ).我已经使用 openssl 生成了我的 selfsigned.crt 证书和密钥 selfsigned.key (我在 windows 上,我正在使用 Visual Studio 代码)。 however, after trying during hours I didn't succeed.但是,经过几个小时的尝试,我没有成功。

I checked a lot of websites and its seems doable but I can't do it.我检查了很多网站,它似乎可行,但我做不到。 (My project name is called carsapp that's why you will see it appears in the www file) (我的项目名称叫做 carsapp,这就是为什么你会看到它出现在 www 文件中的原因)

my app.js file:我的 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;

and in my bin directory the www file:在我的 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);
}

As you can see the http server works perfectly but I tried for https but I can't so here it is my code before trying for https.如您所见,http 服务器运行良好,但我尝试了 https 但我不能,所以这是我在尝试 https 之前的代码。

You can enable https by including the https library and then pass the required certificates in as options, along with the express app.您可以通过包含 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);

On a side note I happen to agree with @Quentin.在旁注中,我碰巧同意@Quentin。 If this app faces the world you might want to seriously consider using a reverse proxy.如果这个应用程序面向世界,您可能需要认真考虑使用反向代理。

I suggest making these changes to the 'www' file in your bin folder...我建议对 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