【问题标题】:SSL at ELB but setup with ApacheELB 上的 SSL,但使用 Apache 设置
【发布时间】:2013-09-02 16:08:49
【问题描述】:

现在我有一个启用 SSL 的网站。 SSL 处于 ELB 级别,因此 apache http 服务器永远不会看到它。我正在努力做到这一点,以便 Apache 将强制所有请求具有 https,因此不会发出 http 请求。我正在阅读关于 SO 的其他几篇文章,包括:

Django and SSL question

https://serverfault.com/questions/410542/disable-https-for-certain-path-in-nginx-results-in-instance-behind-elb-going-int

http://www.acmedata.in/2012/08/31/how-to-host-a-django-app-behind-elb-with-ssl/

我可以为此使用 ELB 配置吗?还是我必须从 ELB 中删除私钥等并将其全部放在 Web 服务器级别?我无法找到有关此的任何进一步信息...

【问题讨论】:

    标签: django apache ssl amazon-web-services


    【解决方案1】:

    你可以在 django 级别处理这个,这是我使用的:

    from django.http import HttpResponsePermanentRedirect
    from django.conf import settings
    
    
    class SecureRequiredMiddleware(object):
        def __init__(self):
            self.paths = getattr(settings, 'SECURE_REQUIRED_PATHS')
            self.enabled = self.paths and getattr(settings, 'HTTPS_SUPPORT')
    
        def process_request(self, request):
            if self.enabled and not request.is_secure():
                full_path = request.get_full_path()
    
                for path in self.paths:
                    if full_path.startswith(path):
                        secure_url = request.build_absolute_uri(full_path).replace(
                            'http://', 'https://')
                        return HttpResponsePermanentRedirect(secure_url)
    

    将其添加到文件中并使用中间件设置指向它。然后您将需要添加两个设置项。第一个称为SECURE_REQUIRED_PATHS,它应该是一个 URL 列表,如下所示:

    SECURE_REQUIRED_PATHS = [
        '/login',   #  require HTTPS for any URL starting with `/login`
        '/account', # require HTTPS for any URL starting with `/account`
        '/',        # require HTTPS for all URLs
    ]
    

    第二个应该是一个名为HTTPS_SUPPORT的标志:

    HTTPS_SUPPORT = True
    

    然后,只要用户使用 HTTP 访问您的 SECURE_REQUIRED_PATHS 中的 URL,他们就会被重定向到 HTTPS 等效项。

    【讨论】:

    • 但这会在页面上创建 https 链接吗?还是只是重定向每个请求?我宁愿不那样做……
    • 它只会将请求重定向到您的 SECURE_REQUIRED_PATHS 设置中的 URL。将证书放在应用程序节点而不是 ELB 上是非选项 iirc,因为 ELB 需要能够解密 SSL 流,然后才能真正进行负载平衡。
    • 我明白,但这不是正确的方法。正确的方法是另一种解决方案......因为它会重写http服务器上的URL。此代码将使其首先到达应用程序,然后它将重新运行每个请求(只要它在所需的 https 路径中)。
    • 这里有什么问题,由于响应重写请求而导致性能损失?您可以调整中间件设置,使其首先被激活,如果您的客户端正在缓存,它们将缓存永久重定向。我非常怀疑你是否会注意到这个中间件,事实上,在没有自定义构建的情况下,在 heroku 上运行 django 应用程序需要这样的东西。
    【解决方案2】:

    您可以通过在 Apache 配置中添加这样的重写规则来强制使用 https:

    <VirtualHost *:80>
        ...
        RewriteEngine On
        RewriteCond %{HTTP:X-Forwarded-Proto} !https
        RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent]
        ...
    </VirtualHost>
    

    这里的关键是X-Forwarded-Proto 标头。 ELB 处理 https 并将请求作为 http 转发给 Apache,并且它还在该过程中添加了此标头。重写规则检查此标头以仅重定向并非源自 ELB 的 http 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 2016-03-10
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 2018-04-11
      相关资源
      最近更新 更多