我试图让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请求。

我写了一个简单的基于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 World\n');
});

server.listen(8000);

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


编辑添加:

对于生产系统,你可能最好使用Nginx或HAProxy来代理请求到你的nodejs应用程序。你可以设置Nginx来处理ssl请求,只对你的节点app.js说http。

编辑添加(4/6/2015)

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



当前回答

使用greenlock-express:免费SSL,自动HTTPS

Greenlock处理证书颁发和更新(通过Let’s Encrypt)和http => https重定向,开箱即用。

express-app.js:

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

app.use('/', function (req, res) {
  res.send({ msg: "Hello, Encrypted World!" })
});

// DO NOT DO app.listen()
// Instead export your app:
module.exports = app;

server.js:

require('greenlock-express').create({
  // Let's Encrypt v2 is ACME draft 11
  version: 'draft-11'
, server: 'https://acme-v02.api.letsencrypt.org/directory'

  // You MUST change these to valid email and domains
, email: 'john.doe@example.com'
, approveDomains: [ 'example.com', 'www.example.com' ]
, agreeTos: true
, configDir: "/path/to/project/acme/"

, app: require('./express-app.j')

, communityMember: true // Get notified of important updates
, telemetry: true       // Contribute telemetry data to the project
}).listen(80, 443);

截屏视频

观看快速入门演示:https://youtu.be/e8vaR4CEZ5s

一个主机

提前回答这个问题,因为这是一个常见的后续问题:

您不能在本地主机上拥有SSL证书。但是,你可以使用Telebit这样的软件,它可以让你把本地应用当作真实应用来运行。

您还可以通过DNS-01挑战使用Greenlock的私有域,这是在README中提到的以及支持它的各种插件。

非标准端口(即不是80 / 443)

阅读上面关于localhost的说明-您也不能使用Let's Encrypt的非标准端口。

但是,您可以通过端口转发、sni-route将内部非标准端口公开为外部标准端口,或者使用像Telebit这样的东西为您进行sni路由和端口转发/中继。

您也可以使用DNS-01挑战,在这种情况下,您根本不需要公开端口,您还可以通过这种方式保护私有网络上的域。

其他回答

使用greenlock-express:免费SSL,自动HTTPS

Greenlock处理证书颁发和更新(通过Let’s Encrypt)和http => https重定向,开箱即用。

express-app.js:

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

app.use('/', function (req, res) {
  res.send({ msg: "Hello, Encrypted World!" })
});

// DO NOT DO app.listen()
// Instead export your app:
module.exports = app;

server.js:

require('greenlock-express').create({
  // Let's Encrypt v2 is ACME draft 11
  version: 'draft-11'
, server: 'https://acme-v02.api.letsencrypt.org/directory'

  // You MUST change these to valid email and domains
, email: 'john.doe@example.com'
, approveDomains: [ 'example.com', 'www.example.com' ]
, agreeTos: true
, configDir: "/path/to/project/acme/"

, app: require('./express-app.j')

, communityMember: true // Get notified of important updates
, telemetry: true       // Contribute telemetry data to the project
}).listen(80, 443);

截屏视频

观看快速入门演示:https://youtu.be/e8vaR4CEZ5s

一个主机

提前回答这个问题,因为这是一个常见的后续问题:

您不能在本地主机上拥有SSL证书。但是,你可以使用Telebit这样的软件,它可以让你把本地应用当作真实应用来运行。

您还可以通过DNS-01挑战使用Greenlock的私有域,这是在README中提到的以及支持它的各种插件。

非标准端口(即不是80 / 443)

阅读上面关于localhost的说明-您也不能使用Let's Encrypt的非标准端口。

但是,您可以通过端口转发、sni-route将内部非标准端口公开为外部标准端口,或者使用像Telebit这样的东西为您进行sni路由和端口转发/中继。

您也可以使用DNS-01挑战,在这种情况下,您根本不需要公开端口,您还可以通过这种方式保护私有网络上的域。

这是我的express 4.0的工作代码。

Express 4.0与3.0和其他版本有很大不同。

4.0你有/bin/www文件,你要在这里添加HTTPS。

“npm start”是启动express 4.0服务器的标准方式。

readFileSync()函数应该使用__dirname获取当前目录

而require()使用。/引用当前目录。

首先是私人的。密钥和公共。“/bin”文件夹下的证书文件 它和WWW文件是同一个文件夹。

在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)。

首先,您需要创建selfsigned。钥匙和签名。crt的文件。 转到创建自签名SSL证书或执行以下步骤。

进入终端,执行如下命令。

Sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./selfsigned。输出self - signed.crt

然后输入以下信息 国家名称(2个字母代码)[AU]:美国 州或省名称(全称)[Some-State]:纽约州 区域名称(如城市)[]:纽约 机构名称(例如,公司)[Internet Widgits Pty Ltd]: xyz(您的机构) 组织单位名称(例如,部分)[]:xyz(你的单位名称) 常用名称(例如服务器FQDN或您的名称)[]:www.xyz.com(您的URL) 邮箱[]:您的邮箱

创建后,在代码中添加key & cert文件,并将选项传递给服务器。

const express = require('express');
const https = require('https');
const fs = require('fs');
const port = 3000;

var key = fs.readFileSync(__dirname + '/../certs/selfsigned.key');
var cert = fs.readFileSync(__dirname + '/../certs/selfsigned.crt');
var options = {
  key: key,
  cert: cert
};

app = express()
app.get('/', (req, res) => {
   res.send('Now using https..');
});

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

server.listen(port, () => {
  console.log("server starting on port : " + port)
});

最后使用https运行应用程序。

更多信息https://github.com/sagardere/set-up-SSL-in-nodejs

这就是我的工作方式。所使用的重定向也将重定向所有正常的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);