我创建了一个自签名证书,将其添加到Heroku,并在Heroku上设置了SSL端点,并且我记录heroku certs:info它似乎在那里。
heroku certs:info
我在Express上创建服务器,如下所示:
var server = require('http').createServer(app);
然后重定向到https这样:
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在幕后处理的吗?
server_options
我在Heroku上设置的SSL端点如何与http我创建的服务器交互var server = require('http').createServer(app);?
http
编辑
我只是这样回答另一个问题:
“ SSL终止发生在Heroku的负载均衡器上;它们会向您的应用发送普通(非SSL)流量,因此您的应用应创建一个非HTTPS服务器。”
they send your app plain (non-SSL) traffic
在流量到达您的应用程序之前,在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 …)
高温超导