Как заставить https на эластичном бобовом стебле?


79

Кажется, я не могу заставить https на уровне бесплатного использования эластичного бобового стебля.

Я попробовал следующее предложение в разделе Как принудительно использовать https на эластичном бобовом стебле Amazon без сбоя проверки работоспособности

Использование этого правила перезаписи 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. Не совсем уверен, почему, но теперь это работает.
landland 05

1
Кажется, что Интернет не может прийти к единому, полному и рабочему решению этой проблемы. Надеюсь, вы получите помощь в моем сообщении . Мне пришлось перепрыгнуть через обручи, чтобы наконец придумать это.
ADTC

Может ли кто-нибудь знать, как я могу изменить его, чтобы перенаправить www на не-www RewriteEngine On <If "-n '% {HTTP: X-Forwarded-Proto}' &&% {HTTP: X-Forwarded-Proto}! = 'Https' "> RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R, L] </If>
Махендра Гарг

Ответы:


178

В этом ответе предполагается, что вы уже включили https в группе безопасности балансировщика нагрузки, добавили сертификат SSL в балансировщик нагрузки, перенаправили оба порта 80 и 443 балансировщиком нагрузки и указали свое доменное имя в среде Elastic Beanstalk с помощью Route 53. (или аналогичная служба DNS).

ПРИМЕЧАНИЕ. Этот ответ предназначен для сред Elastic Beanstalk, в которых используется 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>

Объяснение

Это умеренно прямолинейно за пределами 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]

Однако эти конфигурации работают только внутри <VirtualHost>блока. Изменение RewriteCondк <If>блоку позволяет ему работать должным образом за пределами <VirtualHost>блока, что позволяет нам поставить в в автономном Apache конфигурационный файл. Обратите внимание, что стандартная установка Apache на CentOS (включая установку на ElasticBeanstalk) включает соответствие всех файлов /etc/httpd/conf.d/*.conf, что соответствует пути к файлу, в котором мы храним этот файл.

-n '%{HTTP:X-Forwarded-Proto}'Часть состояния предотвращает его переадресации , если вы не за балансировки нагрузки, что позволяет иметь общую конфигурацию между производственной Evironment с балансировки нагрузки и HTTPS, а также промежуточную среду , которая является один экземпляр и не имеет HTTPS. В этом нет необходимости, если вы используете балансировщики нагрузки и https во всех своих средах, но это не повредит.

Плохие решения, которые я видел

Я видел много плохих решений этой проблемы, и стоит просмотреть их, чтобы понять, почему это решение необходимо.

  1. Используйте Cloudfront: некоторые люди предлагают использовать некэшированную настройку Cloudfront перед Elastic Beanstalk для перенаправления HTTP на HTTPS. Это добавляет совершенно новую услугу (тем самым усложняя), что не совсем подходит (Cloudfront - это CDN; это не подходящий инструмент для принудительного использования HTTPS для изначально динамического контента). Конфигурация Apache - нормальное решение этой проблемы, а Elastic Beanstalk использует Apache, так что мы должны идти именно так.

  2. SSH на сервер и ...: Это полностью противоположно Elastic Beanstalk и имеет так много проблем. Любые новые экземпляры, созданные с помощью автомасштабирования, не будут иметь измененной конфигурации. Любые клонированные среды не будут иметь конфигурации. Любое количество разумных изменений среды уничтожит конфигурацию. Это просто плохая идея.

  3. Перезаписать конфигурацию Apache новым файлом: это попадает в правильную область решения, но оставляет вас с кошмаром обслуживания, если Elastic Beanstalk изменяет аспекты настройки сервера (что они вполне могут сделать). Также смотрите проблемы в следующем пункте.

  4. Динамически отредактируйте файл конфигурации Apache, чтобы добавить несколько строк: это хорошая идея. Проблема заключается в том, что он не будет работать, если Elastic Beanstalk когда-либо изменит имя своего конфигурационного файла Apache по умолчанию, и что этот файл может быть перезаписан, когда вы меньше всего этого ожидаете: https://forums.aws.amazon.com/thread .jspa? threadID = 163369.


3
Отличный ответ, это сработало отлично. В моем проекте еще не было каталога .ebextensions, поэтому я создал его и поместил вашу конфигурацию в файл .conf с произвольным именем. Мне удалось отключить обычный порт в настройках консоли с эластичным бобовым стеблем, что кажется идеальным.
Тайлер

4
Это фантастический ответ, он действительно должен быть вверху страницы. @landland, вы должны принять этот ответ.
gtd

1
Отличный и чистый ответ, работал у меня без проблем. Я добавил R=301для того, чтобы отправить постоянное перенаправление.
LoicAG 01

1
Я сожалею, что могу дать только один голос. Огромная проблема в том, что на форумах AWS есть неправильный ответ на это!
Cfreak 01

2
по какой-то причине у меня это не работает. ssl_rewrite.confфайл создается (проверено с eb ssh) , но не редирект не происходит. : S
mb21

16

РЕДАКТИРОВАТЬ: Хотя мне нравится этот ответ, теперь он очень старый . 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. В приложении Elastic Beanstalk перейдите в Конфигурация -> Уровень сети -> Балансировка нагрузки и щелкните значок шестеренки .

  3. Выберите безопасный порт слушателя , как 443 . Выберите Протокол как HTTPS . Выберите CERTIFICATE_NAMEиз шага 2 для идентификатора сертификата SSL . Сохраните конфигурацию.

  4. Зайдите в свою консоль . Щелкните Экземпляры EC2 . Щелкните « Балансировщики нагрузки» . Щелкните балансировщики нагрузки. Щелкните Экземпляры и прокрутите вниз, чтобы увидеть экземпляры EC2, назначенные этому балансировщику нагрузки. Если экземпляр EC2 имеет то же имя, что и URL-адрес вашего приложения (или что-то похожее), обратите внимание на DNS-имя для балансировщика нагрузки. Он должен быть в форматеawseb-e-...

  5. Вернитесь к своей консоли . Щелкните CloudFront . Щелкните " Создать распространение" . Выберите распространение в Интернете .

  6. Настроить раздачу. Установите в качестве исходного доменного имени DNS-имя балансировщика нагрузки, которое вы нашли на шаге 5 . Установите политику протокола Viewer для перенаправления HTTP на HTTPS . Установите для параметра Forward Query Strings значение Yes . Задайте для альтернативных доменных имен (CNAME) URL-адреса, которые вы хотите использовать для своего приложения. Установите сертификат SSL на тот, который CERTIFICATE_NAMEвы загрузили на шаге 2 . Создайте свой дистрибутив.

  7. Щелкните имя своего распространения в CloudFront. Нажмите « Происхождение» , выберите свое начало и нажмите « Изменить» . Убедитесь, что ваша политика протокола Origin - Match Viewer . Вернись. Щелкните " Поведение" , выберите источник и щелкните " Изменить" . Измените заголовки переадресации на белый список и добавьте хост . Сохранить.

Примечание: я также написал более подробное руководство .


Сделал именно это, но выдает сообщение «Запрос не может быть выполнен». «CloudFront не смог подключиться к источнику», только когда я занесу в белый список заголовок хоста. Если я установил для заголовков пересылки значение none, то он работает, но не перенаправляет на https, все HTTP-запросы остаются http. Есть предположения?
Влад

@Adam Не могли бы вы вставить сюда весь файл elasticbeanstalk.conf? или дайте ссылку?
thekosmix

@thekosmix elasticbeanstalk.confФайл здесь не должен вступать в игру, если вы не переопределяете настройки в приведенном выше руководстве.
Адам Линк

Но экземпляры ec2 (их DNS) в балансировщике нагрузки эфемерны, не так ли? Я не уверен, что у вас так много голосов за совершенно ошибочное решение.
themihai

@themihai. На самом деле это не так - решение не использует EC2 DNS или IP (которые недолговечны). URL-адрес DNS, который вы получаете, статичен для среды. Шаг EC2 - получить URL-адрес DNS для использования на шаге 6, где вы связываете среду с распределением CloudFront. Приведенное выше решение может не сработать, поскольку ему уже год, но оно определенно сработало, когда я его опубликовал.
Адам Линк

6

Самая высокая оценка не работает для меня .. директива <If> работает только с 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, см. В этом ответе


1
Дополнительное примечание об этом ответе: блок <if> был новым в версии 2.4 и не работает в версии 2.2, поэтому вы не видите его здесь.
fivedogit

Все стеки решений EB PHP теперь используют Apache 2.4+
Энди МакКлаггейдж,

5

С новыми балансировщиками нагрузки приложений вы можете сделать это довольно тривиально ...

Убедитесь, что вы установили один из них во время настройки среды EB (я считаю, что по умолчанию все еще используется классический балансировщик нагрузки). Вы не можете изменить тип после создания среды, поэтому воссоздайте его.

Как только это будет сделано, перейдите в настройки EC2 -> Load Balancers. Щелкните балансировщик нагрузки, созданный для среды EB. Вы должны убедиться, что перед этой задачей настроили прослушиватель HTTPS, поэтому убедитесь, что вы слушаете HTTPS 443 с сертификатом SSL и перенаправляете трафик на свои экземпляры с HTTP на 80.

Затем добавьте нового слушателя, который слушает HTTP, и добавьте действие по умолчанию «Перенаправить на:». Убедитесь, что вы установили HTTPS в качестве протокола, 443 в качестве порта, «Исходный хост, путь, запрос» в качестве опции и, наконец, 301 в качестве кода ответа HTTP.

После добавления этого прослушивателя убедитесь, что вы обновили свою группу безопасности EC2 Load Balancer, чтобы принимать как HTTPS, так и HTTP-соединения, вы увидите небольшой предупреждающий знак на прослушивателе, чтобы напомнить вам!

Крис


Спасибо, это работает для моего www. маршрут, но не голый домен. Любые предложения о том, почему это может быть?
Крис

4

Изменить: решение Zags более общее и правильное. Я рекомендую его вместо моего (который характерен для среды 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не обязательно должен существовать, см. Ответ
Анатолий Васильев

1
Добавление файла в /etc/httpd/conf.d было отличной идеей. Это помогло мне найти общее решение ( stackoverflow.com/a/38751749/2800876 )
Zags

4

Я пытаюсь перенаправить эластичный beanstalk с помощью loadbalancer в 2018 году. Ни один из приведенных выше ответов не работает в моей среде. Я столкнулся с несколькими проблемами:

  1. Я пробовал ответ, получивший наибольшее количество голосов, но мой кот - это версия 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>

Надеюсь, это поможет.


Он перенаправляет на https, но говорит, что сервер не найден. Я использую веб-приложение
Spring

Я получаю nginx: [emerg] unknown directive "<VirtualHost" в журналах EB после добавления этого. Кто-нибудь еще видел такое поведение?
Fabian

3

У меня это работает со следующей командой:

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/…
themihai

3

Ни один из приведенных выше ответов не помог мне, но некоторые помогли мне выяснить ответ, который сработал для меня. Также я нашел приведенный ниже URL-адрес, который помог 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, скопируйте его из своего экземпляра и поместите в свою кодовую базу под .ebextention под httpd / conf.d / elasticbeanstalk / 00_application.conf Теперь отредактируйте этот файл и добавьте ниже между VirtualHost

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

Теперь разверните свой код. Он должен работать.


2

На эластичном beanstalk вы можете просто добавить свою конфигурацию, чтобы 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, а остальные просто указывают, какой файл и папку вы хотите перезаписать. Если файла или папки не существует, просто создайте их.


2

Мне было трудно понять это, поэтому после того, как я придумал решение, я написал подробное объяснение своего решения, чтобы, надеюсь, помочь кому-то другому. Это характерно для приложений Tomcat 8, Apache2 и Spring Boot. В github лаборатории AWS есть действительно полезные примеры ebextension .

Резюме того, что сработало для меня:

  1. Создайте файл в /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf
  2. Добавьте условия / правила перезаписи, стараясь включить "LoadModule rewrite_module modules / mod_rewrite.so"
  3. Развернуть в AWS EBS

Вот пример приложения Spring Boot .


1

У меня есть следующие конфигурации для эластичного beanstalk (64-разрядная версия Amazon Linux 2016.09 v2.3.1 с Tomcat 8 Java 8). Я создал каталог .ebextensions и добавил файл .config YAML с условиями перезаписи

Описанное выше решение Zagas (которое очень сложно) у меня не работает.

  1. Потому что условие "Если" неизвестно
  2. Из-за Apache 2.2 у меня нет mod_rewrite.so, включенного в мой файл httpd.conf

Для меня это решение имеет больше смысла, но и оно не работает. Ничего не происходит, и я не вижу файл «ssl_rewrite.conf» в каталоге «conf.d».

Третьим проверенным решением было добавление файлов «run.config» и «ssl_rewrite.conf» в каталог «.ebextendsion».

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 автоматически создаст для вас файл.
ADTC

Я использовал вышеуказанный метод (в моем комментарии) для развертывания этого файла как части приложения (вместо того, чтобы записывать его непосредственно в текущий экземпляр). Я проверил через SSH, что файл существует. Тем не менее, это также не сработало для меня, несмотря на то, что мои настройки были очень близки к вашим: 64-битный Amazon Linux 2016.03 v2.1.1 с Tomcat 8 Java 8 Одна вещь, однако, файл вообще не существовал изначально - он был создан новым . Должен ли я /etc/httpd/conf.d/elasticbeanstalk.confвместо этого редактировать ?
ADTC

1

На всякий случай кто-то еще борется:

Некоторое время я боролся, и, наконец, я нашел GitHub (от команды AWS) со всеми конфигурациями AWS, и приведенный ниже пример работает для перенаправления HTTP> HTTPS для Apache 2.2. (Конфиги для 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

Кроме того, доступно множество других полезных конфигураций и примеров.

С уважением


1

Включение HTTPS через переменную среды

Мне нужно было применять HTTPS только для нашей производственной среды, а не для среды разработки и тестирования, которая также находится на Elastic Beanstalk, но не использует балансировщик нагрузки (и, следовательно, не может получить сертификат напрямую).

Я использую переменную окружения 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файла, если хотите.


1

У AWS также есть документация по этому поводу.

Если вы используете балансировщик нагрузки приложения, добавьте файл http-to-https.configв свою .ebextensionsпапку, а затем добавьте следующую конфигурацию ( не забудьте указать ARN вашего сертификата https ):

ПРИМЕЧАНИЕ. Убедитесь, что вы еще не добавили прослушиватель на порт 443 через консоль EB. Если вы это сделали, удалите прослушиватель перед добавлением файла .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 и т. Д.


1

Я нашел здесь полезный ответ .

Все, что я сделал, это сделал путь проверки работоспособности, /index.phpа не /в процессе балансировки нагрузки приложения по умолчанию.


0

Почему бы вам просто не поместить файл .htaccess в корневую папку? Таким образом, вы можете просто протестировать и отладить его. И если вы включите его в .zip, он снова будет автоматически развернут во всех экземплярах.

Просто используйте .htaccess:

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

0

Обратите внимание, что ответ, получивший наибольшее количество голосов, устарел. Ответ Пола на самом деле правильный ответ. Ссылка, предоставленная в его ответе, принадлежит AWS (поэтому это рекомендуемый метод переопределения вашей конфигурации Apache для перенаправления с HTTP на HTTPS при запуске вашего приложения на Elastic Beanstalk).

Следует отметить одну очень важную вещь. Если вы развертываете более одного веб-приложения, то добавление папки .ebextensions в одно из ваших веб-приложений не сработает. Вы заметите, что ни одна из указанных вами конфигураций не записывается или не создается. Если вы развертываете несколько веб-приложений в среде Elastic Beanstalk, вам необходимо прочитать эту статью AWS Java Tomcat Deploy Multiple WAR files on Elastic Beanstalk

В общем, вам потребуется следующая структура, прежде чем запускать на ней команду eb для развертывания файлов WAR:

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

если папка .ebextentions существует внутри каждого файла WAR, вы заметите, что она полностью игнорируется и никакие изменения конфигурации производиться не будут.

Надеюсь, это поможет кому-то другому.


0

Мы решили это на нашем сервере, 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']
    ]

0

Чтобы расширить еще два ответа на этот вопрос https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 . Для пользователей с весенней загрузкой, которые развертывают свои сервисы на AWS с помощью ELB и нуждаются в пошаговом руководстве, вы можете добавить файл ****. Conf в src / main / webapp / .ebextensions / httpd / conf.d / вашего проекта. .

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-war-plugin в свой 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 и codepipeline, чтобы забрать ваш код из вашего репозитория и развернуть его в среде beanstalk, или просто упакуйте свой проект в файл war и загрузите его в среду beanstalk AWS


0

AWS не принимает символы подчеркивания (_) в заголовках, в то время как мы можем использовать (-). Итак, удалите подчеркивания из переменных заголовка, например: - header_var_val = "some value" замените его на headervarval = "some value" . Меня устраивает.


-4

Если вы используете среду с балансировкой нагрузки, вы можете следовать инструкциям по настройке HTTPS для среды AWS Elastic Beanstalk и в конце отключить порт HTTP.

Обратите внимание, что в настоящее время уровень бесплатного использования AWS включает такое же количество часов для эластичной балансировки нагрузки (ELB), что и для микро-экземпляра EC2.


7
Таким образом, вы включаете только HTTPS, но не обеспечиваете его соблюдение. Применение означает автоматическое перенаправление всех HTTP-запросов на HTTPS.
Bastian Venthur

-4

это простое решение

  1. ssh в свой экземпляр EC2
  2. скопируйте содержимое /etc/httpd/conf.d/wsgi.conf в локальный файл с именем wsgi.conf, который будет помещен в базовую папку вашего приложения
  3. Отредактируйте локальную версию wsgi.conf и добавьте следующие правила перенаправления в теги <VirtualHost> </ VirtualHost>

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
  4. Измените «/ status» на любую страницу, которую вы используете в качестве страницы проверки работоспособности .

  5. Сохраните файл
  6. Отредактируйте файл <app> .conf внутри вашего. ebextensions,  чтобы добавить команду контейнера для копирования этой версии wsgi.conf поверх версии Amazon.

    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 теперь будет включать необходимые правила перенаправления.

Он должен работать, и файл будет правильно обновляться при каждом развертывании. Единственное, на что следует обратить внимание, это если Amazon изменит свое базовое содержимое файла wsgi.conf в будущем, ваша копия может перестать работать.

Автор rickchristianson


2
Точная копия его собственного ответа: stackoverflow.com/questions/6858492/… . прекратите публиковать повторяющиеся ответы!
Пареш Майани

проблема решается тем же ответом Smile это спам ??
gusgard

3
ssh-подключение к экземпляру за балансировщиком нагрузки и внесение корректировок лишает смысла Elastic Beanstalk. Что произойдет, если вы увеличите масштаб и получите больше экземпляров? Сделать это со всеми? Вручную?
fivedogit

1
@fivedogit, если вы внимательно прочитаете, вы заметите, что он не вносил никаких изменений в экземпляр с помощью SSH. Он только SSH, чтобы прочитать файл и скопировать его. После этого он использует .ebextensionsв своем развертывании, чтобы правильно вносить корректировки через сам эластичный бобовый стебель, поэтому он не побеждает его цель.
ADTC
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.