在弹性魔豆量瓶中,用SSL使403禁止(Flask on Elastic Beanstalk wit

2019-09-28 09:42发布

这是应用程序的目录结构。

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

这里是内部.elasticbeanstalk文件的片段

#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退房手续csr.pem
  • 取得SSL证书请求科摩并收到三个文件
    • 根CA证书 - AddTrustExternalCARoot.crt
    • 中间CA证书 - PositiveSSLCA2.crt
    • 你PositiveSSL证书 - server.crt这

注:我指定的服务器是Apache的/ OpenSSL的

最后,这里有文件内.ebextensions的片段

#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弹性魔豆文档片段。 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/SSLPython.SingleInstance.html

  • 了mod_ssl - > mod24_ssl由于百胜安装错误。 我很幸运找到了从GitHub此修复程序
  • 01killhttpd排除。 通过多次部署的应用程序去后,杀死的httpd留给应用永久性损坏。

症状如下。

  • 可以访问到http:
  • 给403禁止您没有权限访问/在此服务器上。 对于HTTPS:

如果有必要,我会透露网站地址。

我已在AWS文档中指定的每一步,但仍然未能实现一个单一的目标; 钩住我的网站以https。 有没有可以在网上帮我算出这个足够的职位。 我从负载平衡器没去,因为我使用GoDaddy的域名购买,它太复杂,设立磅域(那是另一回事)。

这里是链接到弹性魔豆日志的快照。

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记录指向我的EC2的IP地址。

总之,我怎么让这个当我EC2服务器设置SSL,它知道它的FQDN是我的自定义域,而不是通过EC2提供的一个?

Answer 1:

警告:我是一个开发者,而不是一个系统管理员,我不知道我在做什么

这一周,我有相同的问题。 包括域名之一。 这里是为我工作的配置。 因为我只是砍死这个togheter反馈是值得欢迎的。

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的版本做。 亚马逊使用Apache 2.2的例子,但在服务器2.4。 确认运行httpd -v 。 如果这是真的,那么看到这个链接 。 这给了我的变化<Proxy *><Directory /opt/python/current/app/> 我不知道之间的差异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”

我会更新配置以反映这些变化。



Answer 2:

这些不匹配:

    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

该指令。



文章来源: Flask on Elastic Beanstalk with SSL gives 403 Forbidden