【问题标题】:NodeJS/Express automatic detection of SSL over HTTP (HTTPS) explanation?NodeJS/Express 自动检测 SSL over HTTP (HTTPS) 解释?
【发布时间】: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?

【问题讨论】:

    标签: node.js express ssl https http-status-code-301


    【解决方案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 上没有“设置”任何东西似乎有点可疑。我现在明白了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-07-13
    • 2013-10-06
    • 2011-11-03
    • 2018-03-13
    • 2013-12-10
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多