在express.js上启用HTTPS

我试图让HTTPS在express.js上工作,但我无法弄清楚。

这是我的app.js代码。

var express = require('express');
var fs = require('fs');

var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');

var credentials = {key: privateKey, cert: certificate};


var app = express.createServer(credentials);

app.get('/', function(req,res) {
    res.send('hello');
});

app.listen(8000);

当我运行它时,它似乎只响应HTTP请求。

我写了简单的基于vanilla node.js的HTTPS应用程序:

var   fs = require("fs"),
      http = require("https");

var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();

var credentials = {key: privateKey, cert: certificate};

var server = http.createServer(credentials,function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn');
});

server.listen(8000);

当我运行这个应用程序时,它确实响应了HTTPS请求。 请注意,我不认为fs结果上的toString()结果很重要,因为我已经使用了两者的组合,但仍然没有es bueno。


编辑添加:

对于生产系统,您最好使用Nginx或HAProxy将请求代理到您的nodejs应用程序。 您可以设置nginx来处理ssl请求,并只向您的节点app.js发送http。

编辑添加(4/6/2015)

对于使用AWS的系统,最好使用EC2弹性负载平衡器来处理SSL终止,并允许定期向您的EC2 Web服务器发送HTTP流量。 为了进一步提高安全性,请设置您的安全组,以便只允许ELB将HTTP流量发送到EC2实例,这将防止外部未加密的HTTP流量击中您的计算机。



在express.js中(自版本3开始),您应该使用以下语法:

var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey  = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');

var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();

// your express configuration here

var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);

httpServer.listen(8080);
httpsServer.listen(8443);

通过这种方式,您可以将本地中间件提供给本地http / https服务器

如果您希望您的应用在低于1024的端口上运行,则需要使用sudo命令(不推荐)或使用反向代理(例如nginx,haproxy)。


我遇到了一个类似的问题,让SSL在端口443以外的端口上工作。在我的情况下,我有一个捆绑证书以及一个证书和一个密钥。 捆绑证书是一个包含多个证书的文件,节点要求您将这些证书分解为数组的单独元素。

    var express = require('express');
    var https = require('https');
    var fs = require('fs');

    var options = {
      ca: [fs.readFileSync(PATH_TO_BUNDLE_CERT_1), fs.readFileSync(PATH_TO_BUNDLE_CERT_2)],
      cert: fs.readFileSync(PATH_TO_CERT),
      key: fs.readFileSync(PATH_TO_KEY)
    };

    app = express()

    app.get('/', function(req,res) {
        res.send('hello');
    });

    var server = https.createServer(options, app);

    server.listen(8001, function(){
        console.log("server running at https://IP_ADDRESS:8001/")
    });

在app.js中,您需要指定https并相应地创建服务器。 另外,请确保您尝试使用的端口实际上允许入站流量。


这是如何为我工作的。 所使用的重定向也将重定向所有正常的http。

const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
var request = require('request');
//For https
const https = require('https');
var fs = require('fs');
var options = {
  key: fs.readFileSync('certificates/private.key'),
  cert: fs.readFileSync('certificates/certificate.crt'),
  ca: fs.readFileSync('certificates/ca_bundle.crt')
};

// API file for interacting with MongoDB
const api = require('./server/routes/api');

// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// Angular DIST output folder
app.use(express.static(path.join(__dirname, 'dist')));

// API location
app.use('/api', api);

// Send all other requests to the Angular app
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.use(function(req,resp,next){
  if (req.headers['x-forwarded-proto'] == 'http') {
      return resp.redirect(301, 'https://' + req.headers.host + '/');
  } else {
      return next();
  }
});


http.createServer(app).listen(80)
https.createServer(options, app).listen(443);
链接地址: http://www.djcxy.com/p/52601.html

上一篇: Enabling HTTPS on express.js

下一篇: How to link a folder with an existing Heroku app