将AWS ELB HTTP请求重定向到HTTPS

时间:2018-04-10 12:58:04

标签: amazon-web-services ssl nginx amazon-elb amazon-ecs

当我们使用AWS Application Load Balancer将传入请求重定向到我们的服务器时,我们创建了一个SSL证书并将其设置为负载均衡器。它都会侦听HTTP 80和HTTPS 443端口的流量。在这两种情况下,流量都会重定向到目标组实例的HTTP 80端口。

在这些情况下,有nginx服务器配置为侦听它们所在实例的HTTP 80端口。(这些实例是弹性容器服务实例)

当我更新nginx.conf文件以重定向传入的HTTP请求以重定向到HTTPS协议时,我们正面临重定向循环。即使原始请求是HTTPS请求,在负载均衡器后面,EC2实例也在侦听HTTP端口。因此,如果原始请求是HTTP或HTTPS无关紧要,则nginx无限发送重定向。

  1. 我看到Cloudfront是一个选项,但我对使用不感兴趣 AWS的另一项服务,并支付额外的钱只是为了克服 这个问题。
  2. 其他解决方案可能是在注册到ELB目标组的实例中将HTTP侦听器更改为HTTPS。由于我们使用的是ECS,因此我们必须找到一种方法来在创建docker镜像时保护我们的SSL证书密钥。我不想将我们的SSL证书放在代码库中供jenkins使用它。如果我选择这个解决方案,还会有额外的工作。
  3. 你有什么更简单的想法来解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

Nginx将始终通过HTTP获取请求,因此显然您无法告诉它重定向所有HTTP请求。 ELB在它发送到后端服务器(名为x-forwarded-proto)的请求上设置一个特殊的HTTP头,您需要配置Nginx来检查浏览器和ELB之间的连接是通过HTTP还是HTTPS,并且只有重定向才是HTTP。我会检查ServerFault上的this answer

答案 1 :(得分:0)

正如Mark B所提到的,检查传入prototol的自定义标头值是处理此问题并消除重定向循环的最简单方法。

但是,如果要确保端到端加密,可以在容器中部署自签名证书。负载均衡器不需要有效的公共证书才能连接到HTTPS源。

通过这种方式,您可以将ALB上的端口80转发到目标组上的端口80(您甚至可以只有一个单独的目标组用于重定向)并强制重定向,就像您现在所做的那样,并转发端口443 ALB到目标组的端口443。