一尘不染

Heroku上的HTTPS + SSL-Node + Express

node.js

我创建了一个自签名证书将其添加到Heroku,并在Heroku上设置了SSL端点,并且我记录heroku certs:info它似乎在那里。

我在Express上创建服务器,如下所示:

var server = require('http').createServer(app);

然后重定向到https这样:

app.use(function(req, res, next) {
    var reqType = req.headers["x-forwarded-proto"];
    reqType == 'https' ? next() : res.redirect("https://" + req.headers.host + req.url);
});

服务器运行正常,但是我在SO上遇到了以下代码片段以创建https服务器:

var keys_dir = './sslcert/';
var server_options = { 
  key  : fs.readFileSync(keys_dir + 'server.key'),
  ca   : fs.readFileSync(keys_dir + 'server.csr'), 
  cert : fs.readFileSync(keys_dir + 'server.crt') 
}

var server = require('https').createServer(server_options,app);

我没有像这个示例那样指向证书/密钥,并且我的站点正在https上运行(尽管锁是红色的,因为它是自签名的)。

  • 所以我的问题是,服务器如何知道我的密钥/证书,而无需像代码段那样显式地指向它们server_options?这是由Heroku在幕后处理的吗?

  • 我在Heroku上设置的SSL端点如何与http我创建的服务器交互var server = require('http').createServer(app);


编辑

我只是这样回答另一个问题:

“ SSL终止发生在Heroku的负载均衡器上;它们会向您的应用发送普通(非SSL)流量,因此您的应用应创建一个非HTTPS服务器。”

  • 到底they send your app plain (non-SSL) traffic是什么意思?这是否意味着我不必https在应用程序中重定向到?

阅读 237

收藏
2020-07-07

共1个答案

一尘不染

在流量到达您的应用程序之前,在Heroku服务器/负载均衡器上完成SSL终止。您添加证书的“内容”不是您的dyno,而是Heroku控制的服务器。

因此,当SSL(https)流量进入时,它在服务器上“停止”(终止)。该服务器将打开一个新的 http
连接到您的dyno,无论获得什么,它都会通过https发送回客户端。

因此,在您的dyno上,您不需要“打扰”证书等,并且您只会看到传入的 HTTP
流量:无论是直接来自http客户端,还是来自与客户端和https进行HTTP对话的Heroku服务器。

重定向到https是另一回事:如果客户端使用http“进入”您的应用程序,而您更喜欢它们使用https,则绝对是重定向。他们将发出一个新请求,这次是https,然后通过Heroku的SSL终止,然后到达您的应用程序。但是现在您知道客户端和Heroku之间的路径是安全的(由于客户端使用https),并且Heroku
SSL终止和您的dyno之间的路径大概是安全的(如果您信任Heroku …)

高温超导

2020-07-07