如何强制弹性魔豆HTTPS?(How to force https on elastic beans

2019-07-19 05:57发布

我似乎无法迫使弹性魔豆的免费使用HTTPS层。

我曾尝试在以下建议如何强制在Amazon Elastic魔豆HTTPS,而不会导致健康检查

使用这种阿帕奇重写规则

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转发端口头具有相同的结果。

我也试过以下重写规则

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

而该规则使重定向循环。 因此,它似乎是在Apache重写规则不拿起弹性负载均衡头X - 转发,端口和X-转发 - 协议,也是一个重定向循环是不是我要的那么多。

请帮忙。 我是新来的AWS,弹性魔豆,而不是非常熟悉Apache的规则。 我不太知道从哪里何去何从。 谢谢。

Answer 1:

这个答案假定您已经启用HTTPS的负载均衡器安全组中,增加了SSL证书负载均衡,增加443负载平衡器转发的端口,并且在弹性魔豆环境与路线53指出你的域名(或相当于DNS服务)。

注意:这个答案是对于使用Apache弹性魔豆环境。 它也可能不是基于泊坞窗的部署工作。

所有你需要做的是以下添加到您的一个.config中的文件.ebextensions项目的目录 :

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>

说明

这是适度直截了当弹性魔豆之外。 人们通常增加了类似下面的一个Apache重写规则:

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

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

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

然而,这些配置仅一个中工作<VirtualHost>块。 不断变化RewriteCond<If>块允许它到外面正常工作<VirtualHost>块,让我们把在一个独立的Apache的配置文件。 注意在CentOS(包括ElasticBeanstalk设置),该标准的Apache安装inculdes匹配所有文件/etc/httpd/conf.d/*.conf ,该文件所在的路径,我们存储这些文件匹配。

所述-n '%{HTTP:X-Forwarded-Proto}'的条件的一部分防止其重定向如果你不后面的负载均衡器,让你有一个生产环境现状与负载平衡器和https之间的共享配置,并登台环境是单一实例,没有HTTPS。 这是没有必要的,如果你使用的是在所有环境中的负载均衡和https,但它不伤害有它。

我看到坏的解决方案

我已经看到了很多不好解决这个问题,这是值得去通过他们了解为什么这个解决方案是必要的。

  1. 使用的Cloudfront:有些人建议使用非缓存的Cloudfront安装在弹性魔豆面前做HTTP到HTTPS重定向。 这增加了一个全新的服务(从而增加了复杂性),这是不完全合适(的Cloudfront是CDN,它不是迫使HTTPS上inherantly动态内容的正确工具)。 Apache配置是正常的解决了这个问题,并弹性青苗使用Apache,所以这是我们应该走的路。

  2. SSH到服务器和...:这是完全对立的弹性魔豆的点,有这么多的问题。 通过自动缩放创建任何新的情况下不会有修改的配置。 任何克隆环境不会有配置。 任何数量的一套合理的环境变化将消灭的配置。 这仅仅是个坏主意。

  3. 覆盖的Apache配置一个新的文件:这是进入溶液权的境界,但给你留下一个维护的噩梦,如果弹性魔豆改变(这是他们很可能也是这样)服务器设置的各个方面。 另请参阅下一个项目的问题。

  4. 动态修改Apache的配置文件中添加几行:这是一个不错的主意。 这样做的问题是,如果弹性魔豆都没有改变其默认的Apache配置文件的名称也不会工作,这个文件可以被覆盖时,你最期待: https://forums.aws.amazon.com/thread .jspa?线程ID = 163369



Answer 2:

编辑:虽然我很喜欢这个答案,现在是很老了 AWS已经拿出了新的服务(如证书管理器 ),使这个答案已经过时的一部分。 另外,使用.ebextensions文件夹Apache是处理这种重定向如上所述的清洁器的方法。

如果你正在主持在S3上你的网站,这个答案的部分仍然可以对你有用。


这为我工作:

  1. 上传使用该证书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/ 
  2. 在您的弹性青苗应用程序,请配置 - > 网络层 - > 负载平衡和点击齿轮图标

  3. 选择安全监听端口443。 选择议定书 HTTPS。 选择CERTIFICATE_NAME步骤2SSL证书ID。 保存配置。

  4. 转到您的控制台 。 点击EC2实例 。 点击负载平衡器 。 点击通过负载平衡器。 点击实例和向下滚动才能看到分配给该负载平衡器的EC2实例。 如果EC2实例具有相同的名称为您的应用程序URL(或者相近),请注意DNS名称的负载平衡器。 它应该是在格式awseb-e-...

  5. 回到你的控制台 。 点击CloudFront的 。 单击创建分布 。 选择一个Web分发。

  6. 设置发布。 设置你的原产地域名为您在步骤5中发现的负载均衡DNS名称。 设置浏览器协议政策 HTTP重定向到HTTPS。 设定前进查询字符串 。 设置备用的域名(CNAME记录),你要使用你的应用程序的网址。 设置SSL证书CERTIFICATE_NAME步骤2中上传。 创建您的通讯。

  7. 点击在CloudFront的分发的名字。 点击起源 ,选择您的起源,然后单击编辑 。 确保您的原产地协议政策匹配浏览器 。 回去。 点击行为 ,选择您的起源,然后单击编辑 。 更改转发头白名单 ,并添加主机 。 保存。

注: 我写了一个较长的引导,以及 。



Answer 3:

最upvoted不为我工作..在<如果>指令只能与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 4:

编辑: 牛头犬的解决方案是更普遍的和正确的。 我建议过我(这是特定于Python的ENV)

下面是我想出了一个清洁,快速的解决方案避免了黑客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”。



Answer 5:

我想重定向与负载均衡器的弹性魔豆在2018年以上都不是答案的作品在我的环境。 几个问题我encoutered:

  1. 我想最投票的答案,但我的Tomcat是2.7版本。 它不支持。

  2. 我用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>

希望这会有所帮助。



Answer 6:

它的下一个命令我工作:

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

并没有HTTPS检查:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

它看起来像ELB X转发 - 协议的值更改为HTTP(即使在TCP协议)。



Answer 7:

以上答案都不为我工作,但一些帮助我弄清楚,为我工作的答案我也发现下面的网址这有助于http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat -platform.html

我创建了上述网址中提到的文件结构发生改变2个文件httpd.conf中00_application.conf

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

LoadModule rewrite_module modules/mod_rewrite.so

做到这一点同样为00_application.conf,从您的实例复制它,把它放在下.ebextention代码库下的httpd / conf.d / elasticbeanstalk / 00_application.conf现在编辑这个文件,并添加下面的虚拟主机之间

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

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



Answer 8:

在弹性魔豆你可以添加在配置您让AWS覆盖他们,这将让您覆盖网络的服务器配置,并提交自己的配置。

只需添加路径下的以下文件:.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标准配置文件夹,其余的只是点到的文件和文件夹,你想要覆盖。 如果该文件或文件夹不存在简单的创建。



Answer 9:

我有困难的时候搞清楚了这一点所以后,我想出了一个解决方案,我写我的解决方案的详细解释 ,希望能够帮助别人。 这是具体到Tomcat 8的Apache2和Spring引导应用程序。 有真正有用的AWS实验室github上ebextension例子 。

对我工作总结:

  1. 创建于/src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf文件
  2. 添加重写conds /规则小心翼翼地包括“的LoadModule rewrite_module模块/ mod_rewrite.so”
  3. 部署到AWS EBS

下面是一个例子春天启动的应用程序 。



Answer 10:

我有弹性魔豆(Tomcat运行的Java 8 8 64位Linux的亚马逊2016.09 V2.3.1)以下配置。 我创建了一个目录.ebextensions并添加了一个的.config YAML文件,重写条件

Zagas 解决上述(这是非常复杂的)对我不起作用。

  1. 因为“如果”的情况是未知
  2. 因为Apache 2.2的我没有mod_rewrite.so包含在我的httpd.conf文件

该解决方案使更多的意义对我来说,也是这不起作用。 什么也没有发生,我不能看到文件“ssl_rewrite.conf”“conf.d”目录下。

第三尝试的解决办法是增加“run.config”和“.ebextendsion”目录下的“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” direcotry创建,但是从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重定向不见了。



Answer 11:

通过环境变量启用HTTPS

我需要强制执行HTTPS只为我们的生产环境中,而不是为发展而举办者这也是对弹性魔豆,但不使用负载平衡器(因此不能直接分配的证书)。

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

.ebextensions /文件/ 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 ,你需要重新部署应用程序,以使更改生效。 您也可以去除echo中的命令https.config如果你想文件。



Answer 12:

你为什么不干脆把根文件夹中的.htaccess文件? 这样,你可以简单地测试和调试。 如果你将其包含在.zip文件,它会自动重新部署到所有实例。

只需使用.htaccess

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


Answer 13:

请注意,大多数投票的答案是现在有点老了。 由A保罗其实答案是正确的答案。 在他的回答中提供的链接是通过AWS(所以它是重写你的Apache配置运行您的弹性魔豆的应用程序时,使从HTTP重定向到HTTPS推荐的方法)。

还有就是要注意一个非常重要的事情。 如果要部署超过1个Web应用程序,然后将里面的Web应用程序之一.ebextensions文件夹没有去上班。 你会发现你指定被写入或创建的配置是无。 如果您在弹性魔豆环境中部署多个Web应用程序,那么你将需要阅读这篇文章AWS 的Java Tomcat的部署多个WAR文件上弹性魔豆

在一般情况下,你需要有以下结构发出的命令EB上之前部署WAR文件:

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

如果每个WAR文件内部存在.ebextentions文件夹,然后你会发现,它完全被忽略,没有配置变化将被执行。

希望这可以帮助别人。



Answer 14:

我们已经解决了它的处理我们的后端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']
    ]


Answer 15:

为了延长另外两个回答这个问题https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 。 对于谁与ELB AWS部署他们的服务,需要一步一步的指导春季开机的用户,你可以在你的项目在src /主/ web应用/ .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>

在此之后,记得要以拿起上面的配置下添加Maven的战争插件“资源”在你的pom.xml。

<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从你的资料库拿起你的代码,并部署到青苗的环境,或者干脆收拾你的项目到一个战争文件,并将其上传到您的AWS豆茎环境



Answer 16:

AWS不接受headders unserscores(_),而我们可以使用( - ),因此,从头部取出变量下划线,例如: - header_var_val =“一些价值”headervarval =“一些价值”代替。 这个对我有用。



Answer 17:

万一有人还在挣扎:

我已经与所有AWS CONFIGS挣扎了一段时间,终于,我发现了一个GitHub的(从AWS团队)和下面的示例适用于为Apache 2.2的HTTP> HTTPS重定向。 (对于CONFIGS为Apache 2.4和Nginx的,请参阅下面的链接)。

Apache 2.2的

  1. 创建您的应用程序的根目录中的文件:YOUR_PROJECT_ROOT / .ebextensions / httpd的/ conf.d / elasticbeanstalk.conf(在使用的IntelliJ / Java的的情况下,确保它去添加至最终.WAR神器)

  2. 添加以下行,以便能够在虚拟主机重定向:

     <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

此外,还有很多更实用的配置和可用的例子。

问候



Answer 18:

如果使用负载平衡的环境中,你可以按照说明配置HTTPS为您的AWS弹性魔豆环境 ,并在年底禁用HTTP端口。

请注意,目前的AWS免费使用层包括的小时为弹性负载平衡(ELB)作为用于EC2微实例相同的量。



Answer 19:

这是一个简单的解决方案

  1. SSH到您的EC2实例
  2. /etc/httpd/conf.d/wsgi.conf的内容复制到本地文件名为wsgi.conf将被放置在你的应用程序的基本文件夹
  3. 编辑wsgi.conf的本地版本和<虚拟主机> </虚拟主机>标记中添加以下重定向规则

     RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301] 
  4. 更改“/状态”您正在使用的健康检查页面的任何页面。

  5. 保存文件
  6. 修改<应用程序> .conf文件里面的文件。 ebextensions目录中添加一个容器命令在亚马逊的版本,这个版本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' ... 
  7. 部署代码。

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

它应该工作,文件将正确更新每个部署。 观看的唯一的事情是,如果亚马逊改变了他们对未来的基础wsgi.conf文件的内容,那么你的副本可能不再有效。

作者rickchristianson



文章来源: How to force https on elastic beanstalk?