簡體   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