我们正在使用config.force_ssl = true运行一个简单的Rails 4.0应用程序(在Ubuntu 14.04上)。 SSL上传到我们的ELB,ELB上的443和80端口在服务器上转发到80。
我们的PCI扫描失败,因为使用HTTP / 1.0,ELB的私有IP显示在Location头中。关于如何解决这个问题的任何想法?我已经研究了好几天,现在真的卡住了。
$ 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=...
答案 0 :(得分:4)
它的PCI合规性失败的原因是因为正在使用的测试nessus plugin 10759使用HTTP 1.0并且没有发送主机头,并且AWS ELB制作了自己的主机头当它连接到您的实例时,无论出于何种原因将其设置为负载均衡器的内部IP。
这是使用Apache的mod_forensics捕获此类请求。请注意主机头,它设置为负载均衡器的内部IP:
+11143:551306af:1 | GET / HTTP / 1.1 | host:10.3.2.57 | X-Forwarded-For:删除 | X-Forwarded-Port:443 | X-Forwarded-Proto :HTTPS |连接:保活
这是请求的方式(使用bash在* nix上):
(echo -ne "GET / HTTP/1.0\r\n\r\n"; sleep 2) | openssl s_client -connect 1.2.3.4:443
其中1.2.3.4是ELB的IP地址。你必须制作这样的请求,因为ELB不会接受\ n \ n直接键入openssl。
请注意,此处发送的唯一标头是GET
。
我的网站未通过PCI扫描,导致我在这里,所以我觉得这需要进一步解释。
答案 1 :(得分:2)
听起来你的ELB正在接收https然后转发http。所以你的Rails服务器不需要担心SSL,因为它唯一与之通信的是ELB。
(这也是我们设置它的方式。)
因此,您可以从Rails服务器中删除config.force_ssl = true
,并使您的ELB需要SSL。