【问题标题】:Flask on Elastic Beanstalk with SSL gives 403 Forbidden带有 SSL 的 Elastic Beanstalk 上的 Flask 提供 403 Forbidden
【发布时间】:2014-10-17 01:48:25
【问题描述】:

这是应用程序目录结构。

  • app/__init_.py
  • 应用/静态/
  • 应用/模型/
  • 应用程序/视图/
  • application.py
  • requirements.txt
  • .elasticbeanstalk/config
  • .elasticbeanstalk/optionsettings.application_name
  • .ebextensions/python.config
  • .ebextensions/https.config

这是 .elasticbeanstalk 中文件的 sn-ps

#config
EnvironmentTier=WebServer::Standard::1.0
EnvironmentType=SingleInstance
Region=us-west-1
ServiceEndpoint=https://elasticbeanstalk.us-west-1.amazonaws.com
SolutionStack=64bit Amazon Linux 2014.03 v1.0.3 running Python

#optionsettings.application_name
[aws:elasticbeanstalk:container:python]
NumProcesses=1
NumThreads=15
StaticFiles=/static/=app/static/
WSGIPath=application.py

[aws:elasticbeanstalk:container:python:staticfiles]
/static/=app/static/

这是我从 CheapSSL 创建 SSL 证书所采取的步骤

  • openssl genrsa 2048 > privatekey.pem
  • openssl req -new -key privatekey.pem -out csr.pem
  • 向 Comodo 提出 SSL 证书请求并收到三个文件
    • 根 CA 证书 - AddTrustExternalCARoot.crt
    • 中间 CA 证书 - PositiveSSLCA2.crt
    • 您的 PositiveSSL 证书 - server.crt

注意:我将服务器指定为 Apache/OpenSSL

最后,这里是 .ebextensions 中文件的 sn-ps

#https.config
Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupName: {Ref : AWSEBSecurityGroup}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

packages:
  yum:
    mod24_ssl : []

files:
  /etc/httpd/conf.d/ssl.conf:
    mode: 000777
    owner: ec2-user
    group: ec2-user
    content: |
      LoadModule ssl_module modules/mod_ssl.so
      Listen 443
      <VirtualHost *:443>
        <Proxy *>
          Order deny,allow
          Allow from all
        </Proxy>
        SSLEngine on
        SSLCertificateFile "/etc/pki/tls/certs/server.crt"
        SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"

        Alias /static /opt/python/current/app/
        <Directory /opt/python/current/app/>
        Order allow,deny
        Allow from all
        </Directory>

        WSGIScriptAlias / /opt/python/current/app/python/application.py

        <Directory /opt/python/current/app/>
        Order allow,deny
        Allow from all
        </Directory>

        WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%{GROUP} \
          python-path=/opt/python/current/app:/opt/python/run/venv/lib/python2.6/site-packages user=wsgi group=wsgi \
          home=/opt/python/current/app
        WSGIProcessGroup wsgi
      </VirtualHost>

  /etc/pki/tls/certs/server.crt:
    mode: 000777
    owner: ec2-user
    group: ec2-user
    content: |
      -----BEGIN CERTIFICATE-----
      #contents from server.crt
      -----END CERTIFICATE-----


  /etc/pki/tls/certs/server.key:
    mode: 000777
    owner: ec2-user
    group: ec2-user
    content: |
      -----BEGIN RSA PRIVATE KEY-----
      #contents from privatekey.pem
      -----END RSA PRIVATE KEY-----

此配置是 AWS Elastic Beanstalk 文档中的一个 sn-p,有少量更改。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/SSLPython.SingleInstance.html

  • mod_ssl -> mod24_ssl 由于 yum 安装错误。我很幸运能从 Github 找到这个修复程序
  • 01killhttpd 已排除。在多次部署应用程序后,杀死 httpd 对应用程序造成永久性损坏。

症状如下。

  • 可以访问http:
  • Gives 403 Forbidden 您无权访问此服务器上的 /。对于 https:

如有必要,我会公开网站地址。

我已采取 AWS 文档中指定的每一步,但仍未能实现单一目标;用 https 连接我的网站。网上没有足够的帖子来帮助我解决这个问题。我远离负载均衡器,因为我使用 GoDaddy 购买了域,并且为 lb 设置域太复杂了(这是另一回事)。

这是指向 Elastic Beanstalk 日志快照的链接。

https://dl.dropboxusercontent.com/u/23288606/Log.txt

提前致谢。

更新:

有人阅读了日志并指出了一条错误消息。

[ssl:warn] [pid 1989] AH01909: [ec2-address].compute.amazonaws.com:443:0 server certificate does NOT include an ID which matches the server name

是的,SSL 证书是指我的自定义域,而服务器仍然认为它是 ec2 的默认公共 DNS(我认为)。

仅供参考,自定义域是从 Godaddy 购买的。我这样做是为了让 A Record 指向我的 ec2 ip 地址。

简而言之,我该如何做到这一点,以便当我的 ec2 服务器设置 ssl 时,它知道它的 fqdn 是我的自定义域,而不是 ec2 提供的域?

【问题讨论】:

    标签: ssl amazon-web-services amazon-ec2 flask amazon-elastic-beanstalk


    【解决方案1】:

    这些不匹配:

        WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%{GROUP} \
          python-path=/opt/python/current/app:/opt/python/run/venv/lib/python2.6/site-packages user=wsgi group=wsgi \
          home=/opt/python/current/app
        WSGIProcessGroup wsgi
    

    你可能应该有:

        WSGIProcessGroup wsgi-ssl
    

    对于那个指令。

    【讨论】:

    • 已应用修复,但问题仍然存在。可能是因为我对 Apache 缺乏了解,但代码 sn-p 中的 user=wsgi group=wsgi 是否也会受到影响?
    • 使用 user=wsgi group=wsgi 可能不是您想要的,因为这意味着您必须在系统上拥有一个名为 UNIX 的用户和组,而您不会这样做。一般来说,除非您知道自己在做什么,否则应该忽略这些选项。尝试将它们设置为甚至不需要的 Apache 用户是指令中的一个常见错误。随意将它们设置为没有相应 UNIX 用户或组的其他内容更糟糕。
    • 我有点迷路了。那么,我要保留 WSGIDaemonProcess 吗?
    • 专家眼中的wsgi设置可能有缺陷,但就日志而言,我认为首先要对ssl设置进行质疑,如问题的更新部分所述。
    • 您的 SSL 证书消息是另一个问题。如果你解决了这个问题,mod_wsgi 就会因为我所指出的而失败。 WSGIProcessGroup 指令的第一个参数必须与您定义的 WSGIDaemonProcess 的第一个参数匹配。现在情况并非如此,所以如果一个请求到达 mod_wsgi,它会出错,说您正在尝试选择一个不存在的守护进程组。为避免这种情况,您需要将 WSGIProcessGroup 指令的参数更改为 wsgi-ssl 以匹配 WSGIDaemonProcess 指令用作第一个参数。
    【解决方案2】:

    警告:我是开发人员,而不是系统管理员,我不知道自己在做什么

    这周我遇到了完全相同的问题。包括域一。这是一个对我有用的配置。欢迎反馈,因为我刚刚破解了这个。

    Resources:
      sslSecurityGroupIngress: 
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
          GroupName: {Ref : AWSEBSecurityGroup}
          IpProtocol: tcp
          ToPort: 443
          FromPort: 443
          CidrIp: 0.0.0.0/0
    
    packages:
      yum:
        mod24_ssl : []
    
    files:
      /etc/httpd/conf.d/ssl.conf:
        mode: "000755"
        owner: root
        group: root
        content: |
          LoadModule ssl_module modules/mod_ssl.so
          Listen 443
          <VirtualHost *:443>
            <Proxy *>
            Require all granted
            </Proxy>
            SSLEngine on
            SSLCertificateFile "/etc/pki/tls/certs/server.crt"
            SSLCertificateChainFile "/etc/pki/tls/certs/inter.crt"
            SSLCertificateKeyFile "/etc/pki/tls/certs/server.key"
    
            Alias /static /opt/python/current/app/printwithme/static
            <Directory /opt/python/current/app/>
            Order allow,deny
            Allow from all
            </Directory>
    
            WSGIScriptAlias / /opt/python/current/app/application.py
    
            <Directory /opt/python/current/app/>
            Require all granted
            </Directory>
    
            WSGIDaemonProcess wsgi-ssl processes=1 threads=15 display-name=%{GROUP} \
              python-path=/opt/python/current/app:/opt/python/run/venv/lib/python2.6/site-packages user=wsgi group=wsgi \
              home=/opt/python/current/app
            WSGIProcessGroup wsgi-ssl
          </VirtualHost>
    
      /etc/pki/tls/certs/server.crt:
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN CERTIFICATE-----
    
          -----END CERTIFICATE-----
    
      /etc/pki/tls/certs/server.key:
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN RSA PRIVATE KEY-----
    
          -----END RSA PRIVATE KEY-----
    
      /etc/pki/tls/certs/inter.crt:
        mode: "000400"
        owner: root
        group: root
        content: |
          -----BEGIN CERTIFICATE-----
    
          -----END CERTIFICATE-----
    
    container_commands:
      01killhttpd:
        command: "killall httpd"
      02waitforhttpddeath:
        command: "sleep 3"
    

    首先添加我认为禁止的问题与文件权限有关。我认为这就是为什么 OP 将他的权限设置为777。就我而言,它与 Apache 版本有关。 Amazon 在他们的示例中使用 Apache 2.2,但在服务器中使用 2.4。通过运行httpd -v 确认。如果这是真的,请参阅this link。这给了我对&lt;Proxy *&gt;&lt;Directory /opt/python/current/app/&gt; 的更改。我不知道Order deny,allowOrder allow,deny 之间的区别,我现在知道它们被称为访问控制。如果我把它们改错了,请告诉我。然后我收到了404 错误。

    更改后我必须更改:

    WSGIScriptAlias / /opt/python/current/app/python/application.py
    

    WSGIScriptAlias / /opt/python/current/app/application.py
    

    这应该指向您创建应用程序对象的文件。你的可能不一样。

    然后不得不改变:

    Alias /static /opt/python/current/app/
    

    Alias /static /opt/python/current/app/my-app-name/static
    

    因为在我的应用程序中,静态文件位于嵌套文件夹中。这应该指向您的目录。注意my-app-name 是一个变量,您可以根据需要进行更改。

    最后我添加了一个chain 文件。这是 SSL 人员用我的证书给我的。您可能还需要添加它。据我了解,它可能是可选的,但不是真的。

    抱歉,如果我错过了什么。

    更新

    我遇到了文件模式问题。我不得不引用他们: 模式:“000755” 模式:“000400”

    我将更新配置以反映这些更改。

    【讨论】:

    • 我想立即尝试一下,但目前我已经永久放弃了 eb。不管这个答案更直接地解决了我的问题!
    猜你喜欢
    • 2014-06-27
    • 2017-06-14
    • 1970-01-01
    • 2016-04-01
    • 2021-07-03
    • 2013-04-01
    • 2023-03-09
    • 2021-12-16
    • 2013-08-29
    相关资源
    最近更新 更多