【问题标题】:How is my https:443 server serving http:80 also?我的 https:443 服务器也如何为 http:80 提供服务?
【发布时间】:2020-09-01 10:12:45
【问题描述】:

我有一个在 AWS 中运行的服务器 EC2 实例,在一个负载均衡器后面,由于我只有一个实例,目前它实际上并没有做任何事情(最终,我计划使用它来扩展和在多个实例之间分配流量)。我正在使用 Rt53 将我的域名指向负载均衡器。

实例上的网络服务器使用 node(js) 和 express 通过端口 443 (https) 为站点提供服务,并加载适当的证书用于加密/身份/等,由 certbot 使用 Let's Encrypt 生成。

负载均衡器配置如下:


load balancer general config


load balancer target config

因此,对于两个端口,负载均衡器都使用 HTTPS:443 指向同一服务器,我认为这会强制对所有连接进行加密。但是,当我输入我的 URL 为 http://mydomain.tld 时,它会将我带到网络服务器,而没有任何迹象表明它是 https 连接。

这是怎么回事?我的 nodejs 服务器没有设置为通过端口 80 执行任何操作,我认为负载均衡器应该将所有连接路由到端口 443。

【问题讨论】:

  • 使用从 http 8- 重定向到 http 443 app.use(function(request, response){ if(!request.secure){ response.redirect("https://" + request.headers .host + request.url); } });

标签: node.js amazon-web-services express amazon-ec2 https


【解决方案1】:

80 是万维网的默认端口。如果您输入 google.com:80,它会正常将您发送到 google,而如果您尝试 google.com:81,您将无法连接。

【讨论】:

    【解决方案2】:

    如果你禁用 80 端口并且有人输入 http://abc 它将显示错误最好的方法是将 80 请求重定向到 443 创建一个从 80 到 443 的重定向。

    app.use(function(request, response){
      if(!request.secure){
        response.redirect("https://" + request.headers.host + request.url);
      }
    });
    

    一般大多数网络服务器都有多个绑定 80 和 443 两者。因为如果证书过期,您可以使用 80。 有几种方法可以启用 Apache 将 http 重定向到 https:

    在所需域的虚拟主机文件中启用重定向。

    在 . htaccess 文件(之前在 web 根文件夹中创建)。

    在虚拟主机文件中使用 mod_rewrite 规则。

    在 . htaccess 文件强制使用 HTTPS。

    https://developer.ibm.com/technologies/node-js/tutorials/make-https-the-defacto-standard/

    【讨论】:

      【解决方案3】:

      因此,如果流量被转发到同一个目标组,这意味着相同的服务器端口将用于来自负载平衡器 (ALB) 的转发流量。

      请求从侦听器映射到此,然后转换为目标组的端口映射。

      因此,这种配置会导致两种可能的实际情况:

      1. client--[HTTP:80]-->ALB--[HTTPS:443]-->EC2
      2. client--[HTTPS:443]-->ALB--[HTTPS:443]-->EC2

      【讨论】:

      • 您的意思是,如果客户端使用我当前的配置与 HTTP 连接,那么到负载均衡器 (client-balancer) 的外部流量是明文,但内部流量 (balancer-ec2) 是加密的?
      • 所以无论目标组端口和协议是什么,它都会通过它发送。所以是的,您可能有 HTTP 纯文本命中 ALB。然后这会作为 HTTPS 转发到目标实例
      • 这很有趣。我没有意识到 ALB 会是一种同时支持这两种协议的方式,而不必在我的服务器上同时支持这两种协议。我猜想强制 HTTPS 连接就像在网络服务器中将 window.location.href 设置为“mydomain.tld”一样简单,并且 ALB 在切换之前处理初始 HTTP 连接。
      • 是的,或者您可以让 alb 执行重定向:aws.amazon.com/premiumsupport/knowledge-center/…
      • 与同一个项目相关的不同问题:我有一个会话实现,其中客户端有一个会话 id cookie,它对应于网络服务器上的会话文件(不在远程数据库中)。如果我在同一个 ALB 后面创建其他实例,是否会扰乱客户端-服务器会话同步?在页面上执行操作或切换页面时,客户端连接是否可以切换到不同的实例?
      猜你喜欢
      • 2017-12-20
      • 2021-11-02
      • 2014-04-02
      • 1970-01-01
      • 2013-07-14
      • 2019-10-03
      • 2016-06-10
      • 1970-01-01
      • 2023-02-14
      相关资源
      最近更新 更多