Як змусити 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

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>
Mahendra Garg

Відповіді:


178

Ця відповідь передбачає, що ви вже ввімкнули https у групі безпеки балансування навантаження, додали сертифікат SSL до балансира навантаження, перенаправляєте балансиром навантаження обидва порти 80 і 443, і вказали своє доменне ім'я на середовище Elastic Beanstalk із маршрутом 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>

Пояснення

Це помірно прямо вперед за межами Еластичного бобового стебла. Зазвичай додається правило перезапису 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. Я зміг утримати звичайний порт вимкненим у налаштуваннях на еластичній консолі Beanstalk, що здається ідеальним.
Тайлер

4
Це фантастична відповідь, дійсно повинна бути вгорі сторінки. @landland ви повинні прийняти цю відповідь.
gtd

1
Чудова і чітка відповідь, працювала для мене бездоганно. Я додав R=301, щоб надіслати постійне переспрямування.
LoicAG

1
Я шкодую, що маю дати лише один голос за. Величезна проблема полягає в тому, що форуми AWS мають неправильну відповідь на це!
Cfreak

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

16

EDIT: Хоча я люблю цю відповідь, вона зараз дуже стара . 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 ID . Збережіть конфігурацію.

  4. Перейдіть на свою консоль . Клацніть Екземпляри EC2 . Клацніть Балансери навантаження . Клацніть між балансирами навантаження. Клацніть Екземпляри та прокрутіть вниз, щоб побачити екземпляри EC2, призначені цьому балансирувачу навантаження. Якщо екземпляр EC2 має те саме ім’я, що і URL-адреса вашого додатка (або щось близьке), зверніть увагу на ім’я DNS для балансування навантаження. Він повинен бути у форматіawseb-e-...

  5. Поверніться до своєї консолі . Клацніть CloudFront . Натисніть Створити розподіл . Виберіть веб- розподіл.

  6. Налаштуйте розподіл. Встановіть для свого вихідного доменного імені ім'я DNS балансувача навантаження, яке ви знайшли на кроці 5 . Встановіть політику протоколу перегляду для перенаправлення HTTP на HTTPS . Встановіть для рядків пересилання запитів значення Так . Встановіть альтернативні доменні імена (CNAME) як URL-адреси, які ви хочете використовувати для своєї програми. Встановіть сертифікат SSL для CERTIFICATE_NAMEзавантаженого на кроці 2 . Створіть свій дистрибутив.

  7. Клацніть на назву розповсюдження в CloudFront. Клацніть Origins , виберіть своє джерело та натисніть Edit . Переконайтеся, що ваша політика протоколу походження є засобом перегляду збігів . Повертайся. Клацніть Поведінки , виберіть своє походження та натисніть Редагувати . Змініть заголовки пересилання на білий список і додайте хост . Зберегти.

Примітка: Я також написав довший путівник .


Зробив саме це, але це дає мені "Запит не може бути задоволений". "CloudFront не зміг підключитися до джерела.", Лише коли я додав заголовок хосту в білий список. Якщо я встановив вперед заголовки на none, це працює, але це не перенаправляє на https, всі http-запити залишаються http. Будь-які думки?
Влад

@Adam Чи можете ви, будь-ласка, вставити сюди весь файл elasticbeanstalk.conf? або дайте мені посилання на це?
текосмікс

@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 Solution використовують Apache 2.4+
Andy McCluggage

5

За допомогою нових балансирів навантаження додатків ви можете зробити це досить тривіально зараз ...

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

Після цього перейдіть до налаштувань EC2 -> Балансирів навантаження. Клацніть на балансуванні навантаження, який ви створили для свого середовища EB. Ви повинні переконатися, що ви налаштували прослуховувач HTTPS перед цим завданням, тому переконайтеся, що ви слухаєте на HTTPS 443 із сертифікатом SSL і пересилаєте трафік до своїх екземплярів за допомогою HTTP на 80.

Потім додайте нового слухача, який прослуховує протокол HTTP, і додайте дію за замовчуванням "Перенаправити на:". Переконайтеся, що ви встановили HTTPS як протокол, 443 як порт, "Оригінальний хост, шлях, запит" як опцію і, нарешті, 301 як код відповіді HTTP.

Після додавання цього прослуховувача переконайтеся, що ви оновили свою групу безпеки EC2 Load Balancer, щоб приймати як з'єднання HTTPS, так і HTTP, на слухачі ви побачите невеликий попереджувальний знак, щоб нагадати вам!

Кріс


Дякую, я змусив це працювати для мого www. маршрут, але не оголений домен. Будь-які пропозиції щодо того, чому це може бути?
Кріс

4

Редагувати: рішення Zags є більш загальним і правильним. Я рекомендую його замість мого (що є специфічним для 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".


Отже, я працюю над одним середовищем EBS. /etc/httpd/conf.d/https_redirect.conf існує, і він переспрямовує на https. Проблема полягає у другому середовищі, встановленому точно так само, файл /etc/httpd/conf.d/https_redirect.conf НЕ є. Будь-які ідеї?
Nitzan Wilnai

@NitzanWilnai /etc/httpd/conf.d/https_redirect.confне повинен існувати, див. Відповідь
Анатолій Васильєв

1
Додавання файлу до /etc/httpd/conf.d було чудовою ідеєю. Це допомогло мені дістатися до спільного рішення ( stackoverflow.com/a/38751749/2800876 )
зигзаги

4

У 2018 році я намагаюся перенаправити еластичний бобовий стебло за допомогою балансира навантаження. Жодна з наведених відповідей не працює в моєму середовищі. Кілька випусків, якими я займався:

  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>

Сподіваюся, це допоможе.


Він переспрямовує на https, але каже, що сервер не знайдений. Я використовую весняний веб-додаток MVC
ponraj

nginx: [emerg] unknown directive "<VirtualHost" Після додавання цього я отримую журнали EB. Хтось ще бачив таку поведінку?
Фабіан

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 ви можете просто додати свою конфігурацію on, щоб 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. Є дійсно корисні приклади розширення в лабораторіях AWS github .

Короткий зміст того, що мені вдалося:

  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 у моєму файлі httpd.conf у мене немає mod_rewrite.so, включеного

Це рішення має для мене більше сенсу, але також це не працює. Нічого не відбувається, і я не бачу файл "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 / 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, вам потрібно передислокувати свою програму, щоб ця зміна набрала чинності. Ви також можете видалити 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).

Зауважимо одну дуже важливу річ. Якщо ви розгортаєте більше 1 веб-програми, додавання папки .ebextensions всередину однієї з ваших веб-програм не буде працювати. Ви помітите, що жодна із вказаних вами конфігурацій не пишеться або створюється. Якщо ви розгортаєте кілька веб-програм у середовищі Elastic Beanstalk, вам доведеться прочитати цю статтю AWS Java Tomcat Розгортання декількох файлів WAR на Elastic Beanstalk

Загалом, перед тим, як надати команду eb для розгортання файлів WAR, вам потрібно мати таку структуру:

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

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

Сподіваюся, це допомагає комусь іншому.


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 codebuild і codepipeline заберуть ваш код із вашого сховища та розгорнуть у середовищі beanstalk, або просто запакуйте свій проект у військовий файл і завантажте його у своє середовище beanstalk AWS


0

AWS не приймає символи без символів (_) у заголовках, тоді як ми можемо використовувати (-), тому Видаліть підкреслення із змінних заголовка, приклад: - header_var_val = "деяке значення", замініть його на headervarval = "деяке значення" . Це працює для мене.


-4

Якщо ви використовуєте середовище із збалансованим навантаженням, ви можете слідувати інструкціям із налаштування HTTPS для вашого середовища пружного Beanstalk AWS і в кінці вимкнути порт HTTP.

Зверніть увагу, що в даний час рівень вільного використання AWS включає ту саму кількість годин для еластичного балансування навантаження (ELB), як для мікроінстанції EC2.


7
Таким чином ви вмикаєте лише HTTPS, але не застосовуєте його. Примусове застосування означає, що ви автоматично перенаправляєте всі запити HTTP на HTTPS.
Бастіан Вентур

-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/… . припиніть публікувати дублікати відповідей!
Paresh Mayani

проблему можна вирішити за допомогою тієї ж відповіді;) її спам ??
gusgard

3
ssh-ing в екземпляр за балансиром навантаження та внесення коригувань перемагає мету Elastic Beanstalk. Що відбувається, коли ви масштабуєтесь і отримуєте більше екземплярів? Зробити це на всіх них? Вручну?
Fivedogit

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