Ruby on rails AWS ELB在重定向时继续在位置标头中显示私有IP

Ruby on rails AWS ELB在重定向时继续在位置标头中显示私有IP,ruby-on-rails,amazon-web-services,nginx,passenger,amazon-elb,Ruby On Rails,Amazon Web Services,Nginx,Passenger,Amazon Elb,我们正在运行一个简单的Rails 4.0应用程序(在Ubuntu 14.04上),config.force_ssl=true。SSL被上传到我们的ELB,ELB上的443和80端口被转发到服务器上的80端口 我们的PCI扫描一直失败,因为在HTTP/1.0中,ELB的私有IP显示在位置头中。有没有关于如何解决这个问题的IDE?我已经对此进行了几天的广泛研究,现在真的陷入了困境 $ telnet app.ourwebsite.com 80 GET / HTTP/1.0 HTTP/1.1 301

我们正在运行一个简单的Rails 4.0应用程序(在Ubuntu 14.04上),config.force_ssl=true。SSL被上传到我们的ELB,ELB上的443和80端口被转发到服务器上的80端口

我们的PCI扫描一直失败,因为在HTTP/1.0中,ELB的私有IP显示在位置头中。有没有关于如何解决这个问题的IDE?我已经对此进行了几天的广泛研究,现在真的陷入了困境

$ telnet app.ourwebsite.com 80
GET / HTTP/1.0

HTTP/1.1 301 Moved Permanently
...
*Location: https://172.31.26.236/*
Server: nginx/1.6.2 + Phusion Passenger 4.0.57
Set-Cookie: AWSELB=...

听起来您的ELB正在接收https,然后在http上转发。因此,您的Rails服务器不需要担心SSL,因为它只与ELB通信

(我们也是这样设置的。)


因此,您可以从Rails服务器中删除
config.force\u ssl=true
,并使ELB需要ssl。

其PCI合规性失败的原因是所使用的测试使用HTTP 1.0,并且不发送主机头,AWS ELB在连接到您的实例时会创建自己的主机头,并且无论出于何种原因,都会将其设置为负载平衡器的内部IP

下面是使用Apache的mod_取证捕获到的此类请求。注意主机头,它被设置为负载平衡器的内部IP:

+11143:551306af:1 | GET/HTTP/1.1 | host:10.3.2.57 | X-Forwarded-For:编辑| X-Forwarded-Port:443 | X-Forwarded-Proto:https |连接:保持活动状态

请求是这样发出的(在*nix上使用bash):

其中1.2.3.4是您的ELB的IP地址。您必须像这样处理请求,因为ELB不会接受直接键入到openssl中的\n\n请求

请注意,此处发送的唯一标题是
GET


我的站点未能通过PCI扫描,这导致我来到这里,因此我觉得这需要进一步解释。

感谢您的建议。您能否澄清“使ELB需要SSL”的含义?有没有一种方法可以通过ELB将http转发到https?我找不到解决办法。嗨,丹娜。非常感谢您提供的s_客户示例。我能够重现这个问题。你解决了吗?我现在遇到了与重定向到位置稍有不同的问题:。这是Desive gem强制用户登录。很抱歉,我之前没有看到此评论。我本以为发生这种情况时会给我发电子邮件,但显然它没有这样做。最后我不得不用代码来修复这个问题。如果主机头被设置为类似于以10开头的IP地址,则基本上不返回任何内容,因为我的ELB所在的子网位于该范围内。
(echo -ne "GET / HTTP/1.0\r\n\r\n"; sleep 2) | openssl s_client -connect 1.2.3.4:443