如何检测是否已从ssl连接转发tcp连接?

时间:2015-11-03 00:16:26

标签: ssl amazon-web-services websocket docker http-headers

我正在处理的具体方案是尝试连接到AWS弹性负载均衡器后面的websocket连接,同时强制执行https / ssl而不是http / tcp。

要从http / s启用TCP / SSL升级,负载均衡器上的协议必须已设置为TCP而不是端口80上的HTTP和SSL而不是443上的HTTPS,这两者都转发到实例端口80使用TCP。

但是,将协议设置为TCP / SSL的一个副作用是x-forwarded-proto标头不再设置,如此处所示:

Amazon Elastic load balancer is not populating x-forwarded-proto header

这使得使用http / tcp到https / ssl的任何传入请求的下一个挑战有些问题,因为这通常依赖于检查x-forwarded-proto标题。

关于具体情况的更多细节:存在一个在其内部运行的Meteor.js进程的docker容器,该进程依次驻留在AWS Elastic Beanstalk应用程序中(默认情况下具有Nginx代理层,但这是不可访问的,因为使用了docker简单地从docker hub中提取容器定义,它位于上述ELB的后面。

最终,我在请求通过ELB,Nginx和docker代理层时检查我可用于我的应用程序的标头,尝试计算出客户端发出的原始请求是否已启动使用http或https

传入的https://请求标头:

{
    host: 'whatever.elasticbeanstalk.com',
    'x-real-ip': '999.99.99.99',
    'x-forwarded-for': '999.99.99.99',
    'cache-control': 'max-age=0',
    accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
    'accept-encoding': 'gzip, deflate, sdch',
    'accept-language': 'en-US,en;q=0.8'
}

传入的http://请求标头:

{
    host: 'whatever.elasticbeanstalk.com',
    'x-real-ip': '999.99.99.99',
    'x-forwarded-for': '999.99.99.99',
    'cache-control': 'max-age=0',
    accept: 'image/webp,image/*,*/*;q=0.8',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',
    'accept-encoding': 'gzip, deflate, sdch',
    'accept-language': 'en-US,en;q=0.8',
    'if-none-match': '"141699-1446507991000"',
    'if-modified-since': 'Mon, 02 Nov 2015 23:46:31 GMT'
}

其中唯一看起来含糊不清的是upgrade-insecure-requests标题,但基于此

What is the "Upgrade-Insecure-Requests" HTTP header?

我很确定它不是。

也许我错过了一些东西......

2 个答案:

答案 0 :(得分:5)

如果问题实际上是“我怎样才能确保通过http访问我的网站的任何人都被重定向到https / ssl”(事实证明这就是我的意思),这是可能

  1. 设置Elastic Load Balancer将80上的HTTP转发到实例上的80上的HTTP(而不是之前的80上的TCP),然后将443上的HTTPS转发到实例上的80上的TCP。

  2. 在检测协议期间
  3. “假设HTTPS / SSL”:即检查是否存在x-forwarded-proto,如果存在,则它来自http请求,因此301来自https。如果一个不存在,假设它是https,不要重定向它(实际上我觉得我不妨检查以确保协议在重定向之前是http,但在当前设置中我很确定这是唯一的情况可能发生的事情。)

答案 1 :(得分:3)

当您使用TCP时,ELB不会注入HTTP标头,例如x-forwarded-proto或x-forwarded-for。您可以通过configuring Proxy Protocol获得所需内容。