在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