如何在弹性豆茎上强制 https?

Posted

技术标签:

【中文标题】如何在弹性豆茎上强制 https?【英文标题】:How to force https on elastic beanstalk? 【发布时间】:2013-01-19 13:44:13 【问题描述】:

我似乎无法在弹性豆茎的免费使用层上强制使用 https。

我在How to force https on amazon elastic beanstalk without failing the health check尝试了以下建议

使用这个 Apache 重写规则

RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteCond %REQUEST_URI !^/status$ 
RewriteCond %REQUEST_URI !^/version$ 
RewriteCond %REQUEST_URI !^/_hostmanager/ 
RewriteRule . https://%SERVER_NAME%REQUEST_URI [L,R]

当我尝试这样做时,http 请求不会按照我的意愿重定向到 https。相反,http 页面正常加载。我也尝试使用 X-Forwarded-Port 标头,结果相同。

我也试过下面的重写规则

RewriteCond %SERVER_PORT 80
RewriteRule . https://%SERVER_NAME%REQUEST_URI [L,R]

这个规则会导致重定向循环。因此,似乎 apache 重写规则不会选择 Elastic Load Balancer 标头 X-Forwarded-Port 和 X-Forwarded-Proto,而且重定向循环也不是我想要的。

请帮忙。我是 AWS、Elastic Beanstalk 的新手,对 Apache 规则不是很熟悉。我不太确定从这里去哪里。谢谢。

【问题讨论】:

在其上休眠后,似乎重写规则现在检测到 X-Forwarded-Proto 标头。不完全确定为什么,但现在可以了。 互联网似乎无法就这个问题的单一、完整和有效的解决方案达成一致。希望你能得到一些帮助here in my post。最后,我不得不费尽心思才想出这个。 谁能知道我该如何更改它以将 www 重定向到非 www RewriteEngine On RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L] 另见亚马逊知识中心的How can I redirect HTTP requests to HTTPS using an Application Load Balancer?。实例上不需要服务器配置。 【参考方案1】:

此答案假设您已在负载均衡器安全组中启用 https,将 SSL 证书添加到负载均衡器,负载均衡器转发端口 80 和 443,并将您的域名指向 Elastic Beanstalk 环境使用 Route 53(或等效的 DNS 服务)。

选项 1:使用 Apache 进行重定向

只有在使用 Apache 的 Elastic Beanstalk 环境中才有可能。它可能不适用于基于 docker 的部署。

亚马逊 Linux 2

大多数基于 AWS Linux 版本 2 的平台都可以选择 Apache 作为您的代理主机。这可以通过转到“配置”>“软件”> “容器选项”并将“代理服务器”设置为“Apache”。

完成后,将名为 .platform/httpd/conf.d/ssl_rewrite.conf 的配置文件添加到您的代码库 (relevant AWS docs) 中,其内容如下:

RewriteEngine On
<If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
</If>

亚马逊 Linux 1

您只需将以下内容添加到您的.config files in the .ebextensions directory of your project 之一:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
            RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
            </If>

说明

这在 Elastic Beanstalk 之外是相当直接的。通常会添加一个 Apache 重写规则,如下所示:

RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI

或者,如果在负载均衡器后面,就像我们在这种情况下一样:

RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]

但是,这些配置仅适用于 &lt;VirtualHost&gt; 块。将RewriteCond 更改为&lt;If&gt; 块允许它在&lt;VirtualHost&gt; 块之外正常工作,允许我们放入独立的Apache 配置文件。请注意,CentOS 上的标准 Apache 设置(包括 ElasticBeanstalk 上的设置)包含与 /etc/httpd/conf.d/*.conf 匹配的所有文件,这与我们存储此文件的文件路径匹配。

条件的-n '%HTTP:X-Forwarded-Proto' 部分会阻止它在您不在负载均衡器之后进行重定向,从而允许您在具有负载均衡器和 https 的生产环境与单实例和暂存环境之间共享配置没有https。如果您在所有环境中都使用负载均衡器和 https,则这不是必需的,但拥有它并没有什么坏处。

选项 2:使用 ALB 进行重定向

这只有在您使用应用程序负载均衡器时才有可能。亚马逊在这里有如何做到这一点的说明:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

您需要做的就是将以下内容添加到您的.config files in the .ebextensions directory of your project 之一,以将 http 侦听器替换为重定向:

Resources:
 AWSEBV2LoadBalancerListener:
  Type: AWS::ElasticLoadBalancingV2::Listener
  Properties:
    LoadBalancerArn:
      Ref: AWSEBV2LoadBalancer
    Port: 80
    Protocol: HTTP
    DefaultActions:
      - Type: redirect
        RedirectConfig:
          Host: "#host"
          Path: "/#path"
          Port: "443"
          Protocol: "HTTPS"
          Query: "#query"
          StatusCode: "HTTP_301"

我见过的糟糕解决方案

我已经看到了很多关于这个问题的糟糕解决方案,值得通过它们来理解为什么这个解决方案是必要的。

    使用 Cloudfront: 有人建议在 Elastic Beanstalk 前面使用非缓存 Cloudfront 设置来执行 HTTP 到 HTTPS 的重定向。这增加了一个不完全合适的全新服务(从而增加了复杂性)(Cloudfront 是一个 CDN;它不是在固有动态内容上强制使用 HTTPS 的正确工具)。 Apache config 是这个问题的常规解决方案,而 Elastic Beanstalk 使用 Apache,所以我们应该这样做。

    SSH 进入服务器并...: 这与 Elastic Beanstalk 的观点完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都不会具有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将清除配置。这真是个坏主意。

    用新文件覆盖 Apache 配置: 这进入了正确的解决方案领域,但如果 Elastic Beanstalk 更改服务器设置的各个方面(他们很可能做)。另请参阅下一项中的问题。

    动态编辑 Apache 配置文件以添加几行: 这是一个不错的想法。这样做的问题是,如果 Elastic Beanstalk 更改其默认 Apache 配置文件的名称,它将无法正常工作,并且此文件可能会在您最意想不到的时候被覆盖:https://forums.aws.amazon.com/thread.jspa?threadID=163369

【讨论】:

在 2021 年偶然发现了这一点。我们通过.ebextensions 成功完成了#3,直到我们从 php7.3 升级到 PHP7.4 环境为止。 PHP7.4 的默认 EB 环境是 nginx,所以我们没有意识到我们的 HTTP->HTTPS 重定向停止工作。 @haz 使用哪个网络服务器(Nginx 或 Apache)可在基于 Amazon Linux 2 的环境中配置【参考方案2】:

我发现here 的回答很有帮助。

我所做的只是在应用程序负载均衡器默认进程中创建健康检查路径/index.php 而不是/

【讨论】:

【参考方案3】:

AWS 对此也有一些 documentation。

如果您使用的是应用程序负载均衡器,请将文件 http-to-https.config 添加到您的 .ebextensions 文件夹,然后添加以下配置(不要忘记输入您的 https 证书的 ARN强>):

注意:请确保您尚未通过 EB 控制台在端口 443 上添加侦听器。如果您这样做了,请在添加 .config 文件之前删除侦听器。

Resources:
  AWSEBV2LoadBalancerListener:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      DefaultActions:
        - Type: redirect
          RedirectConfig:
            Protocol: HTTPS
            Port: '443'
            Host: '#host'
            Path: '/#path'
            Query: '#query'
            StatusCode: HTTP_301
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 80
      Protocol: HTTP
  AWSEBV2LoadBalancerListenerHTTPS:
    Type: 'AWS::ElasticLoadBalancingV2::Listener'
    Properties:
      Certificates:
        - CertificateArn: Replace with Certificate ARN
      DefaultActions:
        - Type: forward
          TargetGroupArn:
            Ref: AWSEBV2LoadBalancerTargetGroup
      LoadBalancerArn:
        Ref: AWSEBV2LoadBalancer
      Port: 443
      Protocol: HTTPS 

为此使用 LB 的优势在于,您的配置将与您使用的服务器无关,例如 nginx、apache 等。

【讨论】:

【参考方案4】:

使用新的应用程序负载均衡器,您现在可以相当简单地做到这一点...

确保在设置 EB 环境时设置其中一个(我相信仍然默认为经典负载均衡器)。创建环境后无法更改类型,请重新创建它

完成后,转到您的 EC2 设置 -> 负载均衡器。单击您为 EB 环境创建的负载均衡器。 您必须确保在执行此任务之前已设置 HTTPS 侦听器,因此请确保您使用 SSL 证书侦听 HTTPS 443,并使用 80 上的 HTTP 将流量转发到您的实例。

然后添加一个新的侦听器来侦听 HTTP 并添加一个默认操作“重定向到:”。确保将 HTTPS 设置为协议,443 作为端口,“原始主机、路径、查询”作为选项,最后将 301 作为 HTTP 响应代码。

添加此侦听器后,请确保您更新您的 EC2 负载均衡器安全组以接受 HTTPS 和 HTTP 连接,您将在侦听器上看到小警告标志以提醒您!

克里斯

【讨论】:

谢谢,我得到了这个为我的 www 工作。路由但不是裸域。关于为什么会这样的任何建议?【参考方案5】:

通过环境变量启用 HTTPS

我只需要对我们的生产环境强制实施 HTTPS,而不是对也在 Elastic Beanstalk 上但不使用负载均衡器(因此不能直接分配证书)的开发和暂存环境强制实施 HTTPS。

我使用环境变量USE_HTTPS。当且仅当USE_HTTPS 设置为true 时,我们才复制ssl_rewrite.conf 文件。

.ebextensions/files/ssl_rewrite.conf

RewriteEngine On
<If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R=301,L]
</If>

.ebextensions/https.config

files:
  "/home/ec2-user/https_setup.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash

      echo "USE_HTTPS env var: $USE_HTTPS,,"
      outfile=/etc/httpd/conf.d/ssl_rewrite.conf
      if [ "$USE_HTTPS,," == "true" ]; then
        echo "Configure SSL rewrite"
        cp .ebextensions/files/ssl_rewrite.conf $outfile
        chmod 644 $outfile
        chown root:root $outfile
      else
        [ -f $outfile ] && rm $outfile
        echo "Do not use SSL"
        exit 0
      fi

container_commands:
  01_https_setup:
    command: "/home/ec2-user/https_setup.sh"

请注意,如果您更改USE_HTTPS,您需要重新部署您的应用程序才能使更改生效。如果您愿意,还可以删除https.config 文件中的echo 命令。

【讨论】:

【参考方案6】:

以防万一有人还在苦苦挣扎:

我已经挣扎了一段时间,最后,我找到了一个包含所有 AWS 配置的 GitHub(来自 AWS 团队),下面的示例适用于 Apache 2.2 的 HTTP>HTTPS 重定向。 (有关 Apache 2.4 和 Nginx 的配置,请参阅下面的链接)。

Apache 2.2

    在应用的根目录中创建一个文件: YOUR_PROJECT_ROOT/.ebextensions/httpd/conf.d/elasticbeanstalk.conf (如果使用 IntelliJ / Java,请确保将其添加到最终的 .WAR 工件中)

    添加以下行以在虚拟主机中启用重定向:

    <VirtualHost *:80>
        LoadModule rewrite_module modules/mod_rewrite.so
        RewriteEngine On
        RewriteCond %HTTP:X-Forwarded-Proto !https
        RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker
        RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
    
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
    </VirtualHost>
    

有关 Apache 2.4 和 Nginx 的更多示例,请访问此 GitHub 存储库:

https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat

此外,还有更多有用的配置和示例可用。

问候

【讨论】:

【参考方案7】:

AWS 不接受在 headers 中使用 unserscores (_),而我们可以使用 (-),因此从 header 变量中删除下划线,例如:- header_var_val = "some value" 将其替换为 headervarval = "某个值"。它对我有用。

【讨论】:

【参考方案8】:

我正在尝试在 2018 年使用负载平衡器重定向弹性 beantalk。以上答案均不适用于我的环境。我遇到的几个问题:

    我正在尝试投票最多的答案,但我的 tomcat 是 2.7 版。不支持。

    我正在使用 container_commands 并复制 00_applications 设置。 AWS 只是忽略它。

所以最后我通过阅读这篇文章让它工作了: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html

这是我的工作:

我重新创建了文件夹结构:

.ebextensions 
 - httpd
  -conf.d
   -ssl.conf

然后这是 ssl.conf 的内容

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %HTTP:X-Forwarded-Proto =http
  RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
  <Proxy *>
    Order Allow,Deny
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>

希望这会有所帮助。

【讨论】:

它重定向到 https,但它说找不到服务器。我正在使用 Spring MVC 网络应用程序 添加此内容后,我在 EB 日志中收到了 nginx: [emerg] unknown directive "&lt;VirtualHost" 。还有其他人看到这种行为吗?【参考方案9】:

扩展这个问题的另外两个答案https://***.com/a/43026082/8775205,https://***.com/a/42035023/8775205。 对于使用 ELB 在 AWS 上部署服务并需要分步指南的 Spring Boot 用户,您可以在项目中的 src/main/webapp/.ebextensions/httpd/conf.d/ 下添加一个 ****.conf 文件.

src
--main
----java
----resources
----webapps
------.ebextensions
--------httpd
----------confd
------------****.conf

****.conf 如下所示。注意到我的测试站点只有一个实例,所以我添加了一个条件来排除它。

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %HTTP:X-Forwarded-Proto !https
   RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker 
   RewriteCond %HTTP_HOST !testexample.com #excludes test site
   RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

在这之后,记得在你的 pom.xml 中的 maven-war-plugin 下添加一个“资源”,以便获取上述配置。

<plugin>
     <groupId>org.apache.maven.plugins</groupId>  
     <artifactId>maven-war-plugin</artifactId>  
     <configuration>  
         <webResources>
             <resource>  
               <!-- some other resource configured by yourself-->
             </resource> 
             <resource>
                <directory>src/main/webapps/.ebextensions</directory>
                 <targetPath>.ebextensions</targetPath>
                 <filtering>true</filtering>
             </resource> 
         </webResources>  
     </configuration>  
     <version>2.1.1</version>
 </plugin>

最后提交并推送您的代码,等待 AWS codebuild 和 codepipeline 从您的存储库中获取您的代码并部署到 beanstalk 环境,或者只是将您的项目打包到一个 war 文件中并将其上传到您的 AWS beanstalk 环境

【讨论】:

【参考方案10】:

我们通过正确处理X-Forwarded-Proto 在后端解决了这个问题。

这是我们的 Grails 配置,但它会帮助您实现这个想法:

    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443
    grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugin.springsecurity.secureChannel.definition = [
        [pattern: '/**', access: 'REQUIRES_SECURE_CHANNEL']
    ]

【讨论】:

【参考方案11】:

请注意,投票最多的答案现在有点老了。 A Paul的答案实际上是正确的答案。他的回答中提供的链接是 AWS 提供的(因此,在 Elastic Beanstalk 上运行您的应用程序时,建议覆盖您的 Apache 配置以进行从 HTTP 到 HTTPS 的重定向)。

有一件非常重要的事情需要注意。如果您要部署超过 1 个 Web 应用程序,那么在您的一个 Web 应用程序中添加 .ebextensions 文件夹将不起作用。您会注意到您指定的配置中没有一个正在编写或创建。如果您在 Elastic Beanstalk 环境中部署多个 Web 应用程序,那么您需要阅读 AWS 的这篇文章 Java Tomcat Deploy Multiple WAR files on Elastic Beanstalk

一般来说,在对它发出 eb 命令以部署 WAR 文件之前,您需要具有以下结构:

MyApplication.zip
├── .ebextensions
├── foo.war
├── bar.war
└── ROOT.war

如果 .ebextentions 文件夹存在于每个 WAR 文件中,那么您会注意到它被完全忽略并且不会执行任何配置更改。

希望这对其他人有所帮助。

【讨论】:

【参考方案12】:

我很难弄清楚这一点,所以在我想出一个解决方案后,我 wrote a detailed explanation of my solution 希望能帮助其他人。这特定于 Tomcat 8、Apache2 和 Spring Boot 应用程序。真的很有用ebextension examples in the AWS labs github。

对我有用的总结:

    在 /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf 创建一个文件 添加重写条件/规则,小心包含“LoadModule rewrite_module modules/mod_rewrite.so” 部署到 AWS EBS

这是example Spring Boot app。

【讨论】:

【参考方案13】:

您为什么不简单地将 .htaccess 文件放在根文件夹中?这样你就可以简单地测试和调试它。如果您将其包含在 .zip 中,它将再次自动部署在所有实例上。

只需使用.htaccess:

RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]

【讨论】:

【参考方案14】:

在弹性 beanstalk 上,您只需添加您的 on 配置,以便 AWS 覆盖它们,它将允许您覆盖 Web 服务器配置并提交您自己的配置。

只需在路径下添加以下文件:.ebextensions\httpd\conf.d

文件内容:

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %HTTP:X-Forwarded-Proto !https
   RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker
   RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

“.ebextensions”是 AWS 中的标准配置文件夹,其余的只是指向您希望覆盖的文件和文件夹。 如果文件或文件夹不存在,只需创建它们。

【讨论】:

【参考方案15】:

以上答案都不适合我,但有些答案帮助我找出了适合我的答案 我还找到了以下帮助 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-platform.html

我创建了上面 url 中提到的文件结构来更改 2 个文件 httpd.conf 00_application.conf

从您的实例中复制整个 httpd.conf 并将其放在上述链接中提到的文件夹结构下的 .ebextention 下的代码中。然后只需在项目中的该文件中添加以下行

LoadModule rewrite_module modules/mod_rewrite.so

对 00_application.conf 执行相同操作,从您的实例中复制它并将其放置在您的代码库中 httpd/conf.d/elasticbeanstalk/00_application.conf 下的 .ebextention 下 现在编辑此文件并在 VirtualHost 之间添加以下内容

RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]

现在部署您的代码 它应该可以工作。

【讨论】:

【参考方案16】:

我有以下弹性 beanstalk 配置(运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.09 v2.3.1)。 我创建了一个目录 .ebextensions 并添加了一个带有重写条件的 .config YAML 文件

上述Zagas solution(非常复杂)对我不起作用。

    因为“如果”条件未知 由于 Apache 2.2,我的 httpd.conf 文件中没有包含 mod_rewrite.so

This solution 对我来说更有意义,但这也行不通。什么都没有发生,我在“conf.d”目录下看不到文件“ssl_rewrite.conf”。

第三个尝试的解决方案是在“.ebextendsion”目录下添加“run.config”和“ssl_rewrite.conf”文件。

run_config 包含

container_commands:
copy-config:
command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"

ssl_rewrite.conf 包含

LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule . https://%HTTP:Host%REQUEST_URI [L,R=permanent]

ssl_rewrite.conf 是在“conf.d”目录下创建的,但从 http 重定向到 https 不起作用。

对我来说唯一可行的解​​决方案是在“/etc/httpd/conf.d/elasticbeanstalk/00_application.conf”中添加以下行

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

但这是一个临时解决方案,如果更换机器,我的 https 重定向就会消失。

【讨论】:

“如果更换了机器,我的 https 重定向消失了” 我认为您可以使用 Zags 的回答中显示的相同技巧在 ELB 部署应用程序时自动写入文件在一个新的例子中。基本上,给你files:下的文件路径,content: |下的文件内容,并设置适当的模式,所有者和组。 ELB 会自动为你创建文件。 我已经使用上述方法(在我的评论中)将此文件部署为应用程序的一部分(而不是将其直接写入当前实例)。我通过 SSH 检查该文件是否存在。但是,尽管我的设置与您的设置非常接近,但它对我也不起作用:运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.03 v2.1.1 但有一件事,该文件不存在于最初都是-它是新创建的。我应该编辑/etc/httpd/conf.d/elasticbeanstalk.conf 吗?【参考方案17】:

最赞成的对我不起作用.. 指令仅适用于 Apache 2.4+,但 ElasticBeanstalk 的版本为 2.2.x。

因此,请遵循与上述相同的建议。使用以下内容创建一个名为 .ebextensions/https_rewrite.config 的文件

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %HTTPS !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%SERVER_NAME/$1 [R,L]

这似乎对我有用。

关于如何将此文件构建到您的 WAR 文件中,请参阅answer

【讨论】:

关于这个答案的附加说明: 块是 2.4 中的新块,在 2.2 中不起作用,这就是为什么你在这里看不到它。 EB PHP 解决方案堆栈现在都使用 Apache 2.4+【参考方案18】:

编辑:虽然我喜欢这个答案,但它现在非常古老 AWS 提供了新的服务(如 Certificate Manager),这些服务构成了这个答案的一部分过时的。此外,在 Apache 中使用 .ebextensions 文件夹是一种更简洁的方式来处理上述重定向。

如果您在 S3 上托管您的网站,此答案的部分内容可能对您仍然有用。


这对我有用:

    使用aws 控制台命令将证书上传到 AWS。命令结构为:

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    

    在您的 Elastic Beanstalk 应用程序中,转到 Configuration -> Network Tier -> Load Balancing 并单击 齿轮图标

    选择安全侦听器端口作为443。选择 Protocol 作为 HTTPS。为 SSL 证书 ID 选择 步骤 2 中的 CERTIFICATE_NAME。保存配置。

    转到您的控制台。点击 EC2 实例。点击负载平衡器。单击负载均衡器。单击 Instances 并向下滚动以查看分配给该负载均衡器的 EC2 实例。如果 EC2 实例与您的应用程序 URL 具有相同的名称(或类似名称),请记下负载均衡器的 DNS 名称。格式应为awseb-e-...

    返回您的控制台。单击 CloudFront。点击创建分发。选择一个Web分发版。

    设置分发。将您的 Origin Domain Name 设置为您在 步骤 5 中找到的负载平衡器 DNS 名称。将查看器协议政策设置为将 HTTP 重定向到 HTTPS。将 Forward Query Strings 设置为 Yes。将备用域名 (CNAME) 设置为您要用于您的应用程序的 URL。将 SSL 证书 设置为您在步骤 2 中上传的CERTIFICATE_NAME。创建您的发行版。

    在 CloudFront 中单击您的分配名称。点击Origins,选择您的来源,然后点击Edit。确保您的 Origin Protocol PolicyMatch Viewer。回去。点击Behaviors,选择您的来源,然后点击Edit。将 Forward Headers 更改为 Whitelist 并添加 Host。保存。

注意:I wrote a longer guide as well.

【讨论】:

【参考方案19】:

编辑:Zags solution 更加通用和正确。我推荐它而不是我的(这是特定于 python 环境的)

这是我想出的一个干净快速的解决方案,可以避免入侵 wsgi.conf 或使用 CloudFront

在您的 .ebextensions/some_file.config 中:

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %HTTP:X-Forwarded-Proto ^http$
      RewriteRule .* https://%HTTP_HOST%REQUEST_URI [R=301,L]
      </Directory>

我觉得这太容易了,但似乎工作正常。

另请注意,我明确重定向 HTTP 而不是“非 HTTPS”。

【讨论】:

所以我在一个 EBS 环境中工作。 /etc/httpd/conf.d/https_redirect.conf 存在,它重定向到 https。问题出在第二个环境中,设置方式完全相同,文件 /etc/httpd/conf.d/https_redirect.conf 不存在。有什么想法吗? @NitzanWilnai /etc/httpd/conf.d/https_redirect.conf 不必存在,请参阅answer 将文件添加到 /etc/httpd/conf.d 是个好主意。这帮助我找到了通用解决方案 (***.com/a/38751749/2800876)【参考方案20】:

下一个命令对我有用:

RewriteCond %HTTP:X-Forwarded-Port !=443

并且没有 https 检查:

RewriteCond %HTTP:X-Forwarded-Proto !https

看起来ELB将X-Forwarded-Proto的值更改为http(即使在TCP协议上)。

【讨论】:

这应该是公认的答案。标头已记录在案,因此您可以依赖它们。 docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/…【参考方案21】:

这是一个简单的解决方案

    SSH 进入您的 EC2 实例 将 /etc/httpd/conf.d/wsgi.conf 的内容复制到名为 wsgi.conf 的本地文件中,该文件将放置在应用程序的基本文件夹中

    编辑 wsgi.conf 的本地版本并在 标签中添加以下重定向规则

    RewriteEngine On
    RewriteCond %HTTP:X-Forwarded-Proto !https
    RewriteRule !/status https://%SERVER_NAME%REQUEST_URI [L,R=301]
    

    “/status”更改为您用作健康检查页面的任何页面。

    保存文件

    在您的 .ebextensions 目录中编辑您的 .conf 文件,以添加一个容器命令,将这个版本的 wsgi.conf 复制到亚马逊的版本

    container_commands:
    01_syncdb:
      command: "django-admin.py syncdb --noinput" leader_only: true
    02_collectstatic:
      command: "django-admin.py collectstatic --noinput"
    03_wsgireplace:
      command: 'cp wsgi.conf ../wsgi.conf'
    ...
    

    部署代码。

    /etc/httd/conf.d/wsgi.conf 中部署的 wsg.conf 版本现在将包含必要的重定向规则。

它应该可以工作,并且每次部署都会正确更新文件。唯一需要注意的是,如果 Amazon 将来更改其基本 wsgi.conf 文件内容,那么您的副本可能不再有效。

作者rickchristianson

【讨论】:

他自己的答案完全相同:***.com/questions/6858492/…。停止发布重复的答案! 问题可以用相同的答案解决;)它的垃圾邮件?? ssh 到负载均衡器后面的实例并进行调整违背了 Elastic Beanstalk 的目的。当您扩大规模并获得更多实例时会发生什么?对所有人都这样做吗?手动? @fivedogit 如果您仔细阅读,您会注意到他没有通过 SSH 连接到实例进行调整。他只 SSH 读取文件并复制它。之后,他在他的部署中使用 .ebextensions 通过 Elastic Beanstalk 本身正确地进行调整,所以他没有违背它的目的。【参考方案22】:

如果您使用负载平衡环境,您可以按照Configuring HTTPS for your AWS Elastic Beanstalk Environment 的说明操作,最后禁用 HTTP 端口。

请注意,目前AWS Free Usage Tier 包含的 Elastic Load Balancing (ELB) 小时数与 EC2 微实例相同。

【讨论】:

这样你只启用HTTPS,但你不强制它。强制意味着您自动将所有 HTTP 请求重定向到 HTTPS。

以上是关于如何在弹性豆茎上强制 https?的主要内容,如果未能解决你的问题,请参考以下文章

如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]

如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]

如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]

如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]

如何在弹性豆茎上安装 ng

如何让 phantomjs 安装在弹性豆茎上?