Heroku 上的 HTTPS + SSL - Node + Express

Posted

技术标签:

【中文标题】Heroku 上的 HTTPS + SSL - Node + Express【英文标题】:HTTPS + SSL on Heroku - Node + Express 【发布时间】:2014-09-28 16:29:54 【问题描述】:

我创建了一个self-signed certificate、added it to 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);
);

服务器运行良好,但是我在 S.O. 上遇到了这段代码 sn-p。创建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 的代码 sn-p 那样明确指向它们?这是 Heroku 在幕后处理的吗?

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


编辑

我只是在another question上回答这个问题:

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

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

【问题讨论】:

“我已经创建了一个自签名证书,并将其添加到 Heroku...” - 您可以从 @987654324 获得免费的 1 类服务器证书@ 或 CAcert。我不确定它们是否针对子域发布,但因为它们已经过域验证。 我实际上是在两天前购买了一个证书,但在设置它之前我转移了我的域(第一个主机上的错误决定)。所以我正在等待转移通过,然后将使用购买的证书......但是,我仍然想了解发生了什么。 【参考方案1】:

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

因此,当 SSL (https) 流量进入时,它会在服务器上“停止”(终止)。该服务器打开一个新的 http 连接到您的测功机,然后通过 https 发送回客户端。

因此,在您的测功机上,您不需要“弄乱”证书等,您只会看到传入的 http 流量:无论是直接来自 http 客户端,还是来自使用 https 的 Heroku 服务器给客户和 http 给你。

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

HTH

【讨论】:

感谢您的精彩说明。如果您想强制客户端使用 https,请在此处找到一个实现:github.com/nodenica/node-heroku-ssl-redirect/blob/master/… ws 是这样吗?我可以连接wss,它会自动将其转换为ws吗?

以上是关于Heroku 上的 HTTPS + SSL - Node + Express的主要内容,如果未能解决你的问题,请参考以下文章

Heroku上的OpenSSL :: SSL :: SSLError [重复]

自动SSL或加速ssl无法在heroku上运行

heroku:在免费计划上设置 SSL 证书?

从ExpeditedSSL迁移到免费的Heroku SSL

如何为 Heroku 应用程序配置带有 SSL 的 Amazon Route

如何在 Heroku Cedar 堆栈上使用 .htaccess 重定向到 HTTPS