python - 如何在 AWS Elastic Beanstalk 上设置 HTTPS

标签 python amazon-web-services https amazon-ec2 flask

我是 AWS、Elastic Beanstalk、Apache 和 Flask 的新手。

我正在尝试纯粹通过 HTTPS 为我的 Web 应用程序提供服务。

我提供了我所做的一切细节,希望有人能找到我遗漏或做错的事情。

AWS 设置

我正在使用 AWS Elastic Beanstalk,使用 Amazon Linux AMI,并在最新的 Python 容器 (Python 3.4) 中使用 Flask 和 Flask-Security(处理用户/ session )编写我的应用程序。

我做了什么

  • 我首先通过 Amazon Route 53 购买了一个域,我们称之为 example.com。最初,我设置了所有必需的 DNS 配置,在适当的地方创建了 A 记录以将 www.example.com 指向 example.com,然后CNAME 记录在适当的位置将 example.com 指向我的 AWS Elastic Load Balancer。
  • 接下来,我更新了 Elastic Load Balancer 上的安全组,以允许 HTTP 和 HTTPS 上的入站和出站流量。
  • 然后我从一家流行的提供商那里购买了 SSL 证书。网络上有很多可靠的程序展示了如何执行此操作,因此我从这里省略了它。我在弹性负载均衡器上配置了两个监听器:
  • 一个用于 HTTP 转发到实例端口 80
  • 一个用于 HTTPS 转发到实例端口 80,指定我的 SSL 证书
  • 我编写了我的应用程序的处理程序、配置的端点等,并让它在本地工作。我使用的是 PyCharm 和 AWS Elastic Beanstalk Integration For Web Languages插入。我将它部署到我的 Elastic Beanstalk 实例,除了指定 option_settings 之外没有其他特殊配置在我的配置文件中 .ebextensions项目根目录下。我用它来配置我的 WSGIPath(在那里我暴露了我的 application 可调用)和静态文件:
    option_settings:
      "aws:elasticbeanstalk:container:python":
        WSGIPath: my_app.wsgi
      "aws:elasticbeanstalk:container:python:staticfiles":
        "/static/": "my_app/static/"
        "/favicon.ico": "my_app/static/img/favicon.ico"
    
  • 我部署到 Elastic Beanstalk。它起作用了,并在访问我的网站 时http ://www.example.com/,网站呈现良好。我可以登录,但是显然需要 SSL(因为我以纯文本形式通过网络发送我的用户名/密码)。这验证了我的 option_settings 工作(因为我可以访问我的所有端点,读取我的所有静态文件等。
  • 尝试时它也有效 https ://www.example.com,但仅当我在 URL 前面手动输入 https://时。理想情况下,我希望用户输入 www.example.com 并发现自己位于 https ://www.example.com。我发现的另一个有趣的行为是当我点击 时。 https ://www.example.com 并登录后,我将被发送到主页,那里只是 HTTP,而不是 HTTPS。
  • 最后,我尝试通过 .ebextensions 添加自定义配置AWS 提供的机制。我加了一个 RewriteRule对于所有不是通过 https 进入的流量,通过 https 重定向。我还为端口 443 添加了一个新的 VirtualHost 并添加了我所有的原始映射(从上面开始,刚刚转换为 Apache 配置)。我的 SSL 配置文件如下:
    files:
      "/etc/httpd/conf.d/ssl.conf":
      mode: "000644"
      owner: root
      group: root
      content: |
        <VirtualHost *:80>
            LogLevel debug
            RewriteEngine On
            RewriteCond %{HTTP:X-Forwarded-Proto} !https
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
        </VirtualHost>
    
        <VirtualHost *:443>
            LogLevel debug
            Alias /favicon.ico /opt/python/current/app/my_app/static/img/favicon.ico
            <Directory /opt/python/current/app/my_app/static/img/favicon.ico>
            Order allow,deny
            Allow from all
            </Directory>
    
            Alias /static/ /opt/python/current/app/my_app/static/
            <Directory /opt/python/current/app/my_app/static/>
            Order allow,deny
            Allow from all
            </Directory>
    
            WSGIScriptAlias / /opt/python/current/app/my_app.wsgi
    
            <Directory /opt/python/current/app/>
              Require all granted
            </Directory>
        </VirtualHost>
    
    container_commands:
        restart_apache:
        command: /sbin/service httpd restart
    
  • 现在,在部署该配置文件后,我的网站只会超时 - 无论我访问 http 还是 https://www.example.com。奇怪的是,如果我部署整个 <VirtualHost *:443>指令删除,我只得到一个空白的“/索引”网页。


  • 我希望我的整个网站都通过 HTTPS 提供服务。许多 SO 文章和其他网站指出了如何配置 Elastic Load Balancer 以接受 HTTPS 并转发到 EC2 实例上的端口 80 (HTTP),但是我必须遗漏一些东西 - 好像我的 Apache 服务器没有发送出站流量HTTPS。

    因此,我查看了 Apache 配置并注意到了 RewriteRule 指令,该指令将端口 80 流量重定向到端口 443,但许多建议使用 RewriteRule 的网站也忘记提及我可能需要为端口 443 设置新的 VirtualHost。

    同样,我不确定我是否遗漏了一些关键的东西(显然我的理解存在差距) - 但我似乎无法找到一种方法让我的整个网站通过 HTTPS 运行。

    提前致谢。

    最佳答案

    我的问题在于我如何配置端口。获得证书后,您可以在配置 > 负载均衡器 > 修改中配置您的端口。

    这是我的配置:
    Port configuration, first setting is 80-http, 80-http, the other is 443-https and 80-http with my SSL

    这个资源对我非常有用,如果你需要它会提供更多细节:https://colintoh.com/blog/configure-ssl-for-aws-elastic-beanstalk

    关于python - 如何在 AWS Elastic Beanstalk 上设置 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30451543/

    相关文章:

    amazon-web-services - CLI 复制后文件元数据未保存在 S3 中

    apache - IE 突然停止加载 HTML 页面

    grails - 可以用 g :form and g:link in grails 2. x 建立安全的 https 链接吗?

    python - 在 Windows 上安装 PyCairo

    python - 过滤数据集中的多项分配

    reactjs - aws s3 存储桶中的文件在通过 aws cli 同步后不公开

    java - 将自签名证书导入 Docker 的 JRE cacert 服务无法识别

    python - Project Euler #18 - 如何使用 Python 暴力破解树状结构中的所有可能路径?

    python - 在 N 球面上生成均匀分布的随机点的算法

    node.js - 工作线程启动时出现 Elastic Beanstalk SQSD 错误