Python 允许EC2侦听端口443以获取来自负载平衡器的未加密请求

Python 允许EC2侦听端口443以获取来自负载平衡器的未加密请求,python,ssl,flask,amazon-elastic-beanstalk,wsgi,Python,Ssl,Flask,Amazon Elastic Beanstalk,Wsgi,如何配置.ebextensions,以便EB负载平衡器终止https,然后将未加密的请求转发给我的EC2实例。EC2实例读取请求 我的负载平衡器在两个端口上接受请求。80和443。443有一个上传的证书,我用“AWS Route 53”购买了该证书,并用“AWS certificate Manager”申请了一个证书(需要打开端口443) (***ssl证书隐藏在上面) 我的安全组还允许https通过443 问题是我不知道如何编写.ebextensions/…config,以允许接受来自负载平

如何配置.ebextensions,以便EB负载平衡器终止https,然后将未加密的请求转发给我的EC2实例。EC2实例读取请求

我的负载平衡器在两个端口上接受请求。80和443。443有一个上传的证书,我用“AWS Route 53”购买了该证书,并用“AWS certificate Manager”申请了一个证书(需要打开端口443)

(***ssl证书隐藏在上面)

我的安全组还允许https通过443

问题是我不知道如何编写
.ebextensions/…config
,以允许接受来自负载平衡器的超过443的未加密请求

我找到了这个(亚马逊文档): 和(堆栈溢出):

但我认为这两个例子都说明了负载平衡器只是在转发加密的请求

我在下面尝试过,但没有成功:

#https.config
Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupName: {Ref : AWSEBSecurityGroup}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0
我希望负载平衡器进行解密,然后将未加密的请求转发到我的应用程序使用的端口

在我的应用程序中:

# wsgi.py
from app import application

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=443)
目前
http
运行良好且快速,但
https
只是超时

我是一名开发人员,但我对系统操作几乎一无所知

我已经试着调试这一天多了,所以任何帮助都将非常感谢

更新:

# wsgi.py
from app import application

if __name__ == "__main__":
    application.run(host='0.0.0.0', port=443)
基于此,我尝试改变:

  • /etc/httpd/conf/httpd.conf
  • /etc/httpd/conf.d/wsgi.conf
  • 然后运行
    sudo/sbin/service httpd restart
检查此项


您确实应该考虑不使用内置flask Web服务器,因为它只用于开发。尝试uwsgi或gunicorn

我建议只将Apache设置为侦听端口80,并将负载平衡器更改为将80和443两个传入端口的InstancePort设置为80

在LB终止SSL的好处之一是,您不必担心在上游服务器上处理多个端口

您可以使用X-Forwarded-Proto报头(负载平衡器提供的)来确定请求最初是通过HTTP还是HTTPS发送的,这样您就可以相应地构建链接/URL等

编辑

处理基于该头的URL创建的另一种方法是强制https流量,您可以使用下面的方法,尽管我是nginx用户而不是Apache用户,因此您的里程可能会有所不同,因为下面的配置可能完全是垃圾

<VirtualHost *:80>
    RewriteEngine on
    RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
    RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    …
</VirtualHost>

重新启动发动机
重写cond%{HTTP:X-Forwarded-Proto}^HTTP$
重写规则。*https://%{HTTP_HOST}%{REQUEST_URI}[R=301,L]
…

我能够通过将两个端口作为http从负载平衡器转发到我的EC2实例来解决这个问题

注意实例端口为
80
,实例协议为
HTTP

之前,我无法为第二个协议指定
80
,因为我将协议保留为
HTTPS