NodeJS/Express 自动检测 SSL over HTTP (HTTPS) 解释?

Posted

技术标签:

【中文标题】NodeJS/Express 自动检测 SSL over HTTP (HTTPS) 解释?【英文标题】:NodeJS/Express automatic detection of SSL over HTTP (HTTPS) explanation? 【发布时间】:2018-03-20 12:10:34 【问题描述】:

我在 NodeJS 上使用 Express 有一个通过 HTTPS 的服务器。

上传文件时,我使用控制器中的 req.protocol 指令来获取 URL 的 HTTP 或 HTTPS“部分”,以便我可以使用绝对 URL 保存文件。问题是如果不启用 express (http://expressjs.com/en/api.html#trust.proxy.options.table) 的“信任代理”设置,HTTPS 不会被检测到。

我认为此设置用于实际重定向的情况下(使用 HTTP URL 和服务器执行 301 重定向到 HTTPS 时)。

所以这更像是一个解释问题,而不是一个解决方案:

为什么通过它调用URL时没有检测到HTTPS?

【问题讨论】:

【参考方案1】:

trust proxy 与 301 重定向无关。

在运行您的节点服务器时,该设置很重要在代理之后

  +----------HTTPS--------+---HTTP---+
  |                       |          |
client --> internet --> proxy --> node.js

通常在 Internet 和节点服务器之间存在某种代理;例如 CDN 服务器、负载均衡器或简单的 nginx 实例等。 HTTPS 连接在客户端和该代理之间建立。代理关心 SSL 证书的必要争吵和加密连接,并且不会为您的应用程序服务器(节点)增加这些细节的负担。然后它仅通过纯 HTTP 将请求的相关详细信息转发到您的节点服务器。您的服务器仅将代理视为请求的来源,而不是客户端。

既然节点服务器本身不处理HTTPS连接,它怎么知道客户端和代理之间的连接是不是HTTPS呢?它不能。代理也需要自愿转发该信息。它在X-Forwarded-* HTTP 标头中这样做。在 X-Forwarded-Proto 标头中发送具体是 HTTP 还是 HTTPS 的信息。

问题是,这些只是 HTTP 标头。任何人都可以设置这些标题。客户端本身可以设置这些标头。这就是为什么您需要明确选择使用带有 trust proxy 设置的这些标头,iif 以及何时您知道您的应用将在设置这些标头的代理后面运行。当您没有在代理后面运行但您的节点服务器直接暴露在互联网上时,您必须关闭该设置;否则任何人都可以设置这些标头,您的服务器将服从这些标头并被引导使用虚假信息。

【讨论】:

是的,这非常彻底,事实上,Node 在 HTTPS 上没有“设置”任何东西似乎有点可疑。我现在明白了。谢谢

以上是关于NodeJS/Express 自动检测 SSL over HTTP (HTTPS) 解释?的主要内容,如果未能解决你的问题,请参考以下文章

为 localhost 创建一个受信任的自签名 SSL 证书(用于 Express/Node)

让 SASS 使用 NodeJS Express 和 node-sass 自动编译

为localhost创建受信任的自签名SSL证书(用于Express / Node)

NodeJS:Express 框架实战解析视频教程

nodejs+express打造ansible自动化运维web界面管理

将React + NodeJS + Express + MySQL应用程序部署到Heroku仅部署服务器而不是React