Wie zwinge ich https auf elastische Bohnenstange?


79

Ich kann https nicht auf die kostenlose Nutzungsstufe von elastischer Bohnenstange zwingen.

Ich habe den folgenden Vorschlag unter Wie man https auf Amazon elastische Bohnenstange zwingt, ohne den Gesundheitscheck zu bestehen, ausprobiert

Verwenden dieser Apache-Umschreiberegel

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]

Wenn ich das versuche, werden http-Anfragen nicht wie gewünscht an https umgeleitet. Stattdessen wird die http-Seite normal geladen. Ich habe auch versucht, den X-Forwarded-Port-Header mit dem gleichen Ergebnis zu verwenden.

Ich habe auch die folgende Umschreiberegel ausprobiert

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

Und diese Regel verursacht eine Umleitungsschleife. Es scheint also, dass die Apache-Rewrite-Regeln die Elastic Load Balancer-Header X-Forwarded-Port und X-Forwarded-Proto nicht aufgreifen, aber auch eine Umleitungsschleife ist nicht das, was ich will.

Bitte helfen Sie. Ich bin neu in AWS, Elastic Beanstalk, und mit Apache-Regeln nicht sehr vertraut. Ich bin mir nicht sicher, wohin ich von hier aus gehen soll. Vielen Dank.


Nach dem Schlafengehen erkennen die Umschreiberegeln nun den X-Forwarded-Proto-Header. Nicht ganz sicher warum, aber es funktioniert jetzt.
Landland

1
Es scheint, dass sich das Internet nicht auf eine einzige, vollständige und funktionierende Lösung für dieses Problem einigen kann. Hoffentlich können Sie hier in meinem Beitrag Hilfe bekommen . Ich musste durch Reifen springen, um endlich darauf zu kommen.
ADTC

Kann jemand wissen, wie ich es ändern kann, um www auf non-www umzuleiten? RewriteEngine On <If "-n '% {HTTP: X-Forwarded-Proto}' &&% {HTTP: X-Forwarded-Proto}! = 'Https' "> RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R, L] </ If>
Mahendra Garg

Antworten:


177

Bei dieser Antwort wird davon ausgegangen, dass Sie bereits https in der Load Balancer-Sicherheitsgruppe aktiviert, das SSL-Zertifikat zum Load Balancer hinzugefügt, beide Ports 80 und 443 vom Load Balancer weitergeleitet haben und Ihren Domänennamen auf die Elastic Beanstalk-Umgebung mit Route 53 verwiesen haben (oder gleichwertiger DNS-Dienst).

HINWEIS: Diese Antwort gilt für Elastic Beanstalk-Umgebungen, die Apache verwenden. Bei einer Docker-basierten Bereitstellung funktioniert dies möglicherweise nicht.

Sie müssen lediglich Folgendes zu einer Ihrer .configDateien im .ebextensionsVerzeichnis Ihres Projekts hinzufügen :

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>

Erläuterung

Dies ist außerhalb von Elastic Beanstalk mäßig einfach. Normalerweise fügt man eine Apache-Umschreiberegel wie die folgende hinzu:

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

Oder wenn wir uns hinter einem Load Balancer befinden, wie wir es in diesem Fall sind:

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

Diese Konfigurationen funktionieren jedoch nur innerhalb eines <VirtualHost>Blocks. Wenn Sie das RewriteCondin einen <If>Block ändern, funktioniert es außerhalb eines <VirtualHost>Blocks ordnungsgemäß , sodass wir es in eine eigenständige Apache-Konfigurationsdatei einfügen können. Beachten Sie, dass das Standard-Apache-Setup unter CentOS (einschließlich des Setups unter ElasticBeanstalk) alle übereinstimmenden Dateien enthält /etc/httpd/conf.d/*.conf, die dem Dateipfad entsprechen, in dem wir diese Datei speichern.

Der -n '%{HTTP:X-Forwarded-Proto}'Teil der Bedingung verhindert, dass sie umgeleitet wird, wenn Sie sich nicht hinter einem Load Balancer befinden. Auf diese Weise können Sie eine gemeinsame Konfiguration zwischen einer Produktionsumgebung mit einem Load Balancer und https und einer Staging-Umgebung mit einer einzelnen Instanz und ohne https durchführen. Dies ist nicht erforderlich, wenn Sie Load Balancer und https in all Ihren Umgebungen verwenden, aber es tut nicht weh, sie zu haben.

Schlechte Lösungen habe ich gesehen

Ich habe viele schlechte Lösungen für dieses Problem gesehen, und es lohnt sich, sie durchzugehen, um zu verstehen, warum diese Lösung notwendig ist.

  1. Cloudfront verwenden: Einige Benutzer empfehlen die Verwendung eines nicht zwischengespeicherten Cloudfront-Setups vor Elastic Beanstalk, um die HTTP-zu-HTTPS-Umleitung durchzuführen. Dies fügt einen völlig neuen Dienst hinzu (wodurch die Komplexität erhöht wird), der nicht genau angemessen ist (Cloudfront ist ein CDN; es ist nicht das richtige Tool, um HTTPS für inhärent dynamische Inhalte zu erzwingen). Die Apache-Konfiguration ist die normale Lösung für dieses Problem, und Elastic Beanstalk verwendet Apache. Deshalb sollten wir diesen Weg gehen.

  2. SSH in den Server und ...: Dies ist völlig entgegengesetzt zu Elastic Beanstalk und hat so viele Probleme. Neue Instanzen, die durch automatische Skalierung erstellt wurden, haben keine geänderte Konfiguration. In geklonten Umgebungen ist die Konfiguration nicht vorhanden. Eine beliebige Anzahl angemessener Umgebungsänderungen löscht die Konfiguration. Das ist einfach so eine schlechte Idee.

  3. Überschreiben Sie die Apache-Konfiguration mit einer neuen Datei: Dies führt zum richtigen Lösungsbereich, führt jedoch zu einem Alptraum bei der Wartung, wenn Elastic Beanstalk Aspekte des Server-Setups ändert (was sehr gut möglich ist). Siehe auch die Probleme im nächsten Punkt.

  4. Bearbeiten Sie die Apache-Konfigurationsdatei dynamisch, um einige Zeilen hinzuzufügen: Dies ist eine anständige Idee. Das Problem dabei ist, dass es nicht funktioniert, wenn Elastic Beanstalk jemals den Namen der Standard-Apache-Konfigurationsdatei ändert, und dass diese Datei überschrieben werden kann, wenn Sie es am wenigsten erwarten: https://forums.aws.amazon.com/thread .jspa? threadID = 163369


3
Hervorragende Antwort, das hat perfekt funktioniert. Ich hatte noch kein .ebextensions-Verzeichnis in meinem Projekt, also habe ich eines erstellt und Ihre Konfiguration in eine beliebig benannte .conf-Datei gestellt. Ich konnte den regulären Port in den Einstellungen der elastischen Bohnenstangenkonsole deaktiviert lassen, was ideal erscheint.
Tyler

4
Dies ist eine fantastische Antwort, muss wirklich oben auf der Seite sein. @landland du solltest diese Antwort akzeptieren.
GTD

1
Ausgezeichnete und saubere Antwort, funktionierte nahtlos für mich. Ich habe hinzugefügt R=301, um eine permanente Weiterleitung zu senden.
LoicAG

1
Ich bedauere, dass ich nur eine Gegenstimme zu geben habe. Ein großes Problem ist, dass die AWS-Foren eine falsche Antwort darauf haben!
Cfreak

2
Aus irgendeinem Grund scheint das bei mir nicht zu funktionieren. Die ssl_rewrite.confDatei wird erstellt (überprüft mit eb ssh), es erfolgt jedoch keine Umleitung. : S
mb21

16

EDIT: Während ich diese Antwort liebe, ist sie jetzt sehr alt . AWS hat neue Services (wie Certificate Manager ) entwickelt, die einen Teil dieser Antwort überflüssig machen. Darüber hinaus ist die Verwendung des .ebextensionsOrdners mit Apache eine sauberere Methode, um diese Umleitung wie oben erläutert zu handhaben.

Wenn Sie Ihre Website auf S3 hosten, können Teile dieser Antwort für Sie dennoch nützlich sein.


Das hat bei mir funktioniert:

  1. Laden Sie das Zertifikat mit dem awsKonsolenbefehl in AWS hoch. Die Befehlsstruktur lautet:

    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. Gehen Sie in Ihrer Elastic Beanstalk-Anwendung zu Konfiguration -> Netzwerkebene -> Lastausgleich und klicken Sie auf das Zahnradsymbol .

  3. Wählen Sie Secure Listener Port als 443 . Wählen Sie Protokoll als HTTPS . Wählen Sie die CERTIFICATE_NAMEvon Schritt 2 für SSL - Zertifikat - ID . Speichern Sie die Konfiguration.

  4. Gehen Sie zu Ihrer Konsole . Klicken Sie auf EC2-Instanzen . Klicken Sie auf Load Balancers . Klicken Sie sich durch die Load Balancer. Klicken Sie auf Instanzen und scrollen Sie nach unten, um die diesem Load Balancer zugewiesenen EC2-Instanzen anzuzeigen. Wenn die EC2-Instanz denselben Namen wie Ihre Anwendungs-URL hat (oder etwas Ähnliches), notieren Sie sich den DNS-Namen für den Load Balancer. Es sollte im Format seinawseb-e-...

  5. Gehen Sie zurück zu Ihrer Konsole . Klicken Sie auf CloudFront . Klicken Sie auf Verteilung erstellen . Wählen Sie eine Webdistribution aus .

  6. Richten Sie die Distribution ein. Stellen Sie Ihren Origin-Domänennamen auf den Load-Balancer-DNS-Namen ein, den Sie in Schritt 5 gefunden haben . Stellen Sie die Viewer-Protokollrichtlinie so ein , dass HTTP zu HTTPS umgeleitet wird . Setzen Sie Forward Query Strings auf Yes . Stellen Sie alternative Domänennamen (CNAMEs) auf die URLs ein , die Sie für Ihre Anwendung verwenden möchten. Stellen Sie das SSL-Zertifikat auf das CERTIFICATE_NAMEin Schritt 2 hochgeladene ein . Erstellen Sie Ihre Distribution.

  7. Klicken Sie in CloudFront auf Ihren Distributionsnamen. Klicken Sie auf Ursprung , wählen Sie Ihren Ursprung aus und klicken Sie auf Bearbeiten . Stellen Sie sicher , Ihre Ursprungsprotokoll - Politik ist Spiel - Viewer . Geh zurück. Klicken Sie auf Verhalten , wählen Sie Ihren Ursprung aus und klicken Sie auf Bearbeiten . Ändern Sie die Weiterleitungsheader in Whitelist und fügen Sie Host hinzu . Sparen.

Hinweis: Ich habe auch einen längeren Leitfaden geschrieben .


Habe genau das getan, aber es gibt mir ein "Die Anfrage konnte nicht erfüllt werden." "CloudFront konnte keine Verbindung zum Ursprung herstellen.", Nur wenn ich den Host-Header auf die Whitelist setze. Wenn ich Forward-Header auf none setze, funktioniert es, aber es wird nicht zu https umgeleitet, alle http-Anforderungen bleiben http. Irgendwelche Gedanken?
Vlad

@Adam Kannst du bitte hier deine gesamte Datei elasticbeanstalk.conf einfügen? oder gib mir einen Link davon?
Thekosmix

@thekosmix Die elasticbeanstalk.confDatei sollte hier nicht wirklich ins Spiel kommen, es sei denn, Sie überschreiben die Einstellungen in der obigen Anleitung.
Adam Link

Aber die ec2-Instanzen (ihr DNS) im Load Balancer sind kurzlebig, nicht wahr? Ich bin mir nicht sicher, ob Sie so viele Stimmen für eine völlig fehlerhafte Lösung haben.
Themihai

@themihai Das ist eigentlich nicht richtig - die Lösung verwendet nicht das EC2-DNS oder die IP (die kurzlebig sind). Die DNS-URL, die Sie erhalten, ist für die Umgebung statisch. Der EC2-Schritt besteht darin, die DNS-URL zur Verwendung in Schritt 6 abzurufen, in dem Sie die Umgebung mit der CloudFront-Distribution verknüpfen. Die obige Lösung funktioniert möglicherweise nicht, da sie jetzt ein Jahr alt ist, aber sie hat es sicherlich getan, als ich sie veröffentlicht habe.
Adam Link

6

Das am besten bewertete funktioniert bei mir nicht. Die <If> -Direktive funktioniert nur mit Apache 2.4+, aber ElasticBeanstalk hat Version 2.2.x.

Befolgen Sie also die gleichen Ratschläge wie oben. Erstellen Sie eine Datei mit dem Namen .ebextensions / https_rewrite.config mit dem folgenden Inhalt

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]

Das scheint bei mir zu funktionieren.

Informationen zum Erstellen dieser Datei in Ihre WAR-Datei finden Sie in dieser Antwort


1
Zusätzlicher Hinweis zu dieser Antwort: Der <if> -Block war neu in 2.4 und funktioniert in 2.2 nicht, weshalb Sie ihn hier nicht sehen.
Fivedogit

EB PHP Solution Stacks verwenden jetzt alle Apache 2.4+
Andy McCluggage

5

Mit den neuen Application Load Balancern können Sie dies jetzt ziemlich trivial tun ...

Stellen Sie sicher, dass Sie eine davon zum Zeitpunkt der Einrichtung einer EB-Umgebung einrichten (ich glaube, der Standard ist immer noch der klassische Load Balancer). Sie konnten den Typ nach dem Erstellen der Umgebung nicht mehr ändern. Erstellen Sie ihn daher neu

Wechseln Sie anschließend zu Ihren EC2-Einstellungen -> Load Balancers. Klicken Sie auf den Load Balancer, den Sie für Ihre EB-Umgebung erstellt haben. Sie müssen sicherstellen, dass Sie vor dieser Aufgabe einen HTTPS-Listener eingerichtet haben. Stellen Sie daher sicher, dass Sie HTTPS 443 mit einem SSL-Zertifikat abhören und den Datenverkehr mit HTTP auf 80 an Ihre Instanzen weiterleiten.

Fügen Sie dann einen neuen Listener hinzu, der HTTP abhört, und fügen Sie die Standardaktion "Weiterleiten an:" hinzu. Stellen Sie sicher, dass Sie HTTPS als Protokoll, 443 als Port, "Ursprünglicher Host, Pfad, Abfrage" als Option und schließlich 301 als HTTP-Antwortcode festlegen.

Sobald dieser Listener hinzugefügt wurde, stellen Sie sicher, dass Sie Ihre EC2 Load Balancer-Sicherheitsgruppe so aktualisieren, dass sowohl HTTPS- als auch HTTP-Verbindungen akzeptiert werden. Auf dem Listener wird ein kleines Warnzeichen angezeigt, das Sie daran erinnert!

Chris


Danke, ich habe das für mein www arbeiten lassen. Route, aber nicht die nackte Domäne. Irgendwelche Vorschläge, warum das so sein könnte?
Chris

4

Bearbeiten: Die Zags-Lösung ist allgemeiner und korrekter. Ich empfehle es über meine (die spezifisch für eine Python-Umgebung ist)

Hier ist eine saubere und schnelle Lösung, die ich entwickelt habe, um das Hacken von wsgi.conf oder die Verwendung von CloudFront zu vermeiden

In Ihrer .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>

Ich denke, das ist zu einfach, scheint aber gut zu funktionieren.

Beachten Sie auch, dass ich HTTP explizit anstelle von "nicht HTTPS" umleitung.


Also habe ich das in einer EBS-Umgebung zum Laufen gebracht. /etc/httpd/conf.d/https_redirect.conf ist vorhanden und wird zu https umgeleitet. Das Problem liegt in einer zweiten Umgebung, die genauso eingerichtet wird. Die Datei /etc/httpd/conf.d/https_redirect.conf ist NICHT vorhanden. Irgendwelche Ideen?
Nitzan Wilnai

@NitzanWilnai /etc/httpd/conf.d/https_redirect.confmuss nicht existieren, siehe Antwort
Anatoly Vasilyev

1
Das Hinzufügen einer Datei zu /etc/httpd/conf.d war eine großartige Idee. Dies half mir, zur allgemeinen Lösung zu gelangen ( stackoverflow.com/a/38751749/2800876 )
Zags

4

Ich versuche, eine elastische Bohnenstange mit Loadbalancer im Jahr 2018 umzuleiten. Keine der oben genannten Antworten funktioniert in meiner Umgebung. Einige Probleme, auf die ich gestoßen bin:

  1. Ich habe versucht, die am häufigsten gewählte Antwort zu erhalten, aber mein Kater ist Version 2.7. Es wird nicht unterstützt.

  2. Ich habe container_commands verwendet und die Einstellung 00_applications kopiert. AWS ignoriert es einfach.

Also habe ich es endlich zum Laufen gebracht, indem ich Folgendes gelesen habe: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html

Folgendes mache ich:

Ich habe die Ordnerstruktur neu erstellt:

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

Und dann ist dies der Inhalt von 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>

Hoffe das wird helfen.


Es leitet zu https um, sagt aber, dass der Server nicht gefunden wurde. Ich benutze Spring MVC Web App
Ponraj

Ich erhalte ein nginx: [emerg] unknown directive "<VirtualHost" in den EB-Protokollen, nachdem ich dies hinzugefügt habe. Hat noch jemand dieses Verhalten gesehen?
Fabian

3

Es ist Arbeit für mich mit dem nächsten Befehl:

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

und ohne den https check:

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

Es sieht so aus, als würde ELB den Wert von X-Forwarded-Proto in http ändern (sogar im TCP-Protokoll).


Dies sollte die akzeptierte Antwort sein. Die Header sind dokumentiert, sodass Sie sich auf sie verlassen können. docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/…
themihai

3

Keine der oben genannten Antworten hat für mich funktioniert, aber einige haben mir geholfen, die Antwort herauszufinden, die für mich funktioniert hat. Außerdem habe ich die folgende URL gefunden, die http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat geholfen hat -platform.html

Ich habe die in der obigen URL erwähnte Dateistruktur erstellt, um 2 Dateien httpd.conf 00_application.conf zu ändern

Kopieren Sie die gesamte httpd.conf von Ihrer Instanz und fügen Sie sie in Ihren Code unter .ebextention unter der im obigen Link genannten Ordnerstruktur ein. Fügen Sie dann einfach die folgende Zeile zu dieser Datei in Ihrem Projekt hinzu

LoadModule rewrite_module modules/mod_rewrite.so

Machen Sie dasselbe für 00_application.conf, kopieren Sie es von Ihrer Instanz und platzieren Sie es in Ihrer Codebasis unter .ebextention unter httpd / conf.d / elasticbeanstalk / 00_application.conf. Bearbeiten Sie nun diese Datei und fügen Sie das Folgende zwischen VirtualHost hinzu

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

Stellen Sie jetzt Ihren Code bereit. Es sollte funktionieren.


2

Bei elastischer Beanstalk können Sie einfach Ihre On-Konfiguration hinzufügen, sodass AWS ihre überschreibt. Dadurch können Sie die Webserverkonfiguration überschreiben und Ihre eigene Konfiguration senden.

Fügen Sie einfach die folgende Datei unter dem Pfad hinzu: .ebextensions \ httpd \ conf.d.

Dateiinhalt:

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

Die '.ebextensions' sind der Standardkonfigurationsordner in AWS und der Rest zeigt nur auf die Datei und den Ordner, die Sie überschreiben möchten. Wenn die Datei oder der Ordner nicht vorhanden ist, erstellen Sie sie einfach.


2

Es fiel mir schwer, das herauszufinden. Nachdem ich eine Lösung gefunden hatte, schrieb ich eine detaillierte Erklärung meiner Lösung, um hoffentlich jemand anderem zu helfen. Dies gilt speziell für die Tomcat 8-, Apache2- und Spring Boot-App. Es gibt wirklich nützliche Beispiele für Erweiterungen im AWS Labs Github .

Zusammenfassung dessen, was bei mir funktioniert hat:

  1. Erstellen Sie eine Datei unter /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf
  2. Fügen Sie rewrite conds / rules hinzu und achten Sie darauf, dass "LoadModule rewrite_module modules / mod_rewrite.so" enthalten ist.
  3. Bereitstellung in AWS EBS

Hier ist ein Beispiel für eine Spring Boot App .


1

Ich habe folgende Konfigurationen für elastische Bohnenstange (64 Bit Amazon Linux 2016.09 v2.3.1 mit Tomcat 8 Java 8). Ich habe ein Verzeichnis .ebextensions erstellt und eine .config YAML-Datei mit den Umschreibbedingungen hinzugefügt

Die oben beschriebene Zagas- Lösung (die sehr komplex ist) funktioniert bei mir nicht.

  1. Weil der "Wenn" -Zustand unbekannt ist
  2. Aufgrund von Apache 2.2 ist mod_rewrite.so nicht in meiner httpd.conf-Datei enthalten

Diese Lösung ist für mich sinnvoller, funktioniert aber auch nicht. Es passiert nichts und ich kann die Datei "ssl_rewrite.conf" im Verzeichnis "conf.d" nicht sehen.

Der dritte Lösungsversuch bestand darin, die Dateien "run.config" und "ssl_rewrite.conf" im Verzeichnis ".ebextendsion" hinzuzufügen.

run_config enthält

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

ssl_rewrite.conf enthält

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 wird unter "conf.d" erstellt, aber die Umleitung von http nach https funktioniert nicht.

Die einzige Lösung für mich war, die folgenden Zeilen in "/etc/httpd/conf.d/elasticbeanstalk/00_application.conf" hinzuzufügen.

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

Dies ist jedoch eine vorübergehende Lösung. Wenn ein Computer ersetzt wird, ist meine https-Umleitung weg.


"Wenn ein Computer ersetzt wird, ist meine https-Umleitung weg." Ich denke, Sie könnten den gleichen Trick wie in Zags 'Antwort verwenden, um die Datei automatisch zu schreiben, wenn ELB die Anwendung in einer neuen Instanz bereitstellt. Geben Sie grundsätzlich Ihren Dateipfad unter files:, den Dateiinhalt unter content: |und stellen Sie den entsprechenden Modus, Eigentümer und die Gruppe ein. ELB erstellt dann automatisch die Datei für Sie.
ADTC

Ich habe die obige Methode (in meinem Kommentar) verwendet, um diese Datei als Teil der Anwendung bereitzustellen (anstatt sie direkt in die aktuelle Instanz zu schreiben). Ich habe über SSH überprüft, ob die Datei vorhanden ist. Es hat jedoch auch bei mir nicht funktioniert, obwohl mein Setup Ihrem sehr nahe kommt: 64-Bit Amazon Linux 2016.03 v2.1.1 mit Tomcat 8 Java 8 Eines jedoch war die Datei ursprünglich überhaupt nicht vorhanden - sie wurde neu erstellt . Soll ich stattdessen bearbeiten /etc/httpd/conf.d/elasticbeanstalk.conf?
ADTC

1

Nur für den Fall, dass noch jemand Probleme hat:

Ich habe einige Zeit Probleme und schließlich habe ich einen GitHub (vom AWS-Team) mit allen AWS-Konfigurationen gefunden. Das folgende Beispiel funktioniert für die HTTP> HTTPS-Umleitung für Apache 2.2. (Für Konfigurationen für Apache 2.4 und Nginx siehe den Link unten).

Apache 2.2

  1. Erstellen Sie eine Datei im Stammverzeichnis Ihrer App: YOUR_PROJECT_ROOT / .ebextensions / httpd / conf.d / elasticbeanstalk.conf ( Wenn Sie IntelliJ / Java verwenden, stellen Sie sicher, dass sie dem endgültigen .WAR-Artefakt hinzugefügt wird.)

  2. Fügen Sie die folgenden Zeilen hinzu, um die Umleitung auf dem virtuellen Host zu aktivieren:

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

Weitere Beispiele für Apache 2.4 und Nginx finden Sie in diesem GitHub-Repository:

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

Außerdem stehen viele weitere nützliche Konfigurationen und Beispiele zur Verfügung.

Grüße


1

Aktivieren von HTTPS über eine Umgebungsvariable

Ich musste HTTPS nur für unsere Produktionsumgebung erzwingen und nicht für die Entwicklungs- und Staging-Umgebungen, die sich ebenfalls auf Elastic Beanstalk befinden, aber keinen Load Balancer verwenden (und daher kein Zertifikat direkt zugewiesen werden können).

Ich benutze eine Umgebungsvariable USE_HTTPS. Wir kopieren die ssl_rewrite.confDatei genau dann, wenn eingestellt USE_HTTPSist 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"

Beachten Sie USE_HTTPS, dass Sie bei einer Änderung Ihre Anwendung erneut bereitstellen müssen, damit die Änderung wirksam wird. Sie können die echoBefehle in der https.configDatei auch entfernen, wenn Sie dies wünschen.


0

Warum legen Sie nicht einfach eine .htaccess-Datei im Stammordner ab? Auf diese Weise können Sie es einfach testen und debuggen. Wenn Sie es in die ZIP-Datei aufnehmen, wird es automatisch wieder auf allen Instanzen bereitgestellt.

Verwenden Sie einfach .htaccess:

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

0

Bitte beachten Sie, dass die am häufigsten gewählte Antwort jetzt etwas alt ist. Die Antwort von A Paul ist eigentlich die richtige Antwort. Der in seiner Antwort angegebene Link stammt von AWS (daher wird empfohlen, Ihre Apache-Konfiguration zu überschreiben, um die Umleitung von HTTP zu HTTPS vorzunehmen, wenn Sie Ihre Anwendung auf Elastic Beanstalk ausführen).

Es gibt eine sehr wichtige Sache zu beachten. Wenn Sie mehr als eine Webanwendung bereitstellen, funktioniert das Hinzufügen des Ordners .ebextensions in einer Ihrer Webanwendungen nicht. Sie werden feststellen, dass keine der von Ihnen angegebenen Konfigurationen geschrieben oder erstellt wird. Wenn Sie mehrere Web-Apps in einer Elastic Beanstalk-Umgebung bereitstellen, müssen Sie diesen Artikel von AWS Java Tomcat lesen. Bereitstellen mehrerer WAR-Dateien in Elastic Beanstalk

Im Allgemeinen benötigen Sie die folgende Struktur, bevor Sie den Befehl eb ausführen, um die WAR-Dateien bereitzustellen:

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

Wenn in jeder WAR-Datei der Ordner .ebextentions vorhanden ist, werden Sie feststellen, dass er vollständig ignoriert wird und keine Konfigurationsänderungen vorgenommen werden.

Hoffe das hilft jemand anderem.


0

Wir haben es in unserem Backend gelöst, indem wir es X-Forwarded-Protorichtig gehandhabt haben.

Dies ist unsere Grails-Konfiguration, aber sie hilft Ihnen bei der Idee:

    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

Um zwei weitere Antworten auf diese Frage zu erweitern, https://stackoverflow.com/a/43026082/8775205 , https://stackoverflow.com/a/42035023/8775205 . Für Spring-Boot-Benutzer, die ihre Dienste in AWS mit ELB bereitstellen und eine schrittweise Anleitung benötigen, können Sie in Ihrem Projekt unter src / main / webapp / .ebextensions / httpd / conf.d / eine ****. Conf-Datei hinzufügen .

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

****. conf sieht wie folgt aus. Es wurde festgestellt, dass ich meine Testsite mit einer einzelnen Instanz habe, daher füge ich eine Bedingung hinzu, um sie auszuschließen.

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

Denken Sie danach daran, eine "Ressource" unter dem Maven-War-Plugin in Ihrer pom.xml hinzuzufügen, um die obige Konfiguration zu übernehmen.

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

Legen Sie schließlich Ihren Code fest und übertragen Sie ihn. Warten Sie, bis AWS Codebuild und Codepipeline Ihren Code aus Ihrem Repository abgerufen und in der Beanstalk-Umgebung bereitgestellt haben, oder packen Sie Ihr Projekt einfach in eine War-Datei und laden Sie es in Ihre AWS-Beanstalk-Umgebung hoch


0

AWS akzeptiert keine Unsercores (_) in Überschriften, während wir (-) verwenden können. Entfernen Sie also Unterstriche aus den Header-Variablen. Beispiel: - header_var_val = "irgendein Wert" Ersetzen Sie ihn durch headervarval = "irgendein Wert" . Für mich geht das.


0

AWS hat auch einige Dokumentationen dazu.

Wenn Sie einen Application Load Balancer verwenden, fügen Sie die Datei http-to-https.configIhrem .ebextensionsOrdner hinzu und fügen Sie dann die folgende Konfiguration hinzu ( Vergessen Sie nicht, die ARN Ihres https-Zertifikats einzugeben ):

HINWEIS: Stellen Sie sicher, dass Sie über die EB-Konsole noch keinen Listener an Port 443 hinzugefügt haben. Wenn Sie dies getan haben, löschen Sie den Listener, bevor Sie die .config-Datei hinzufügen.

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 

Der Vorteil der Verwendung Ihrer LB besteht darin, dass Ihre Konfiguration für den von Ihnen verwendeten Server wie Nginx, Apache usw. unabhängig ist.


-4

Wenn Sie eine Umgebung mit Lastenausgleich verwenden, können Sie den Anweisungen zum Konfigurieren von HTTPS für Ihre AWS Elastic Beanstalk-Umgebung folgen und am Ende den HTTP-Port deaktivieren.

Beachten Sie, dass die AWS Free Usage Tier derzeit die gleiche Anzahl von Stunden für einen Elastic Load Balancing (ELB) wie für eine EC2 Micro Instance enthält.


7
Auf diese Weise aktivieren Sie nur HTTPS, erzwingen es jedoch nicht. Durchsetzen bedeutet, dass Sie alle HTTP-Anforderungen automatisch an HTTPS umleiten.
Bastian Venthur

-4

Dies ist eine einfache Lösung

  1. ssh in Ihre EC2-Instanz
  2. Kopieren Sie den Inhalt von /etc/httpd/conf.d/wsgi.conf in eine lokale Datei namens wsgi.conf, die im Basisordner Ihrer Anwendung abgelegt wird
  3. Bearbeiten Sie die lokale Version von wsgi.conf und fügen Sie die folgenden Umleitungsregeln in die Tags <VirtualHost> </ VirtualHost> ein

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
  4. Ändern Sie den Status / in die Seite, die Sie als Integritätsprüfungsseite verwenden .

  5. Speicher die Datei
  6. Bearbeiten Sie Ihre <app> .conf-Datei in Ihrer. ebextensions-  Verzeichnis zum Hinzufügen eines Containerbefehls zum Kopieren dieser Version von wsgi.conf über die Amazon-Version

    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. Stellen Sie den Code bereit.

  8. Die bereitgestellte Version von wsg.conf unter /etc/httd/conf.d/wsgi.conf enthält jetzt die erforderlichen Umleitungsregeln.

Es sollte funktionieren und die Datei wird für jede Bereitstellung ordnungsgemäß aktualisiert. Das einzige, worauf Sie achten müssen, ist, dass Ihre Kopie möglicherweise nicht mehr funktioniert, wenn Amazon in Zukunft den Inhalt der Basisdatei wsgi.conf ändert.

Autor Rickchristianson


2
Exaktes Duplikat seiner eigenen Antwort: stackoverflow.com/questions/6858492/… . Hör auf, doppelte Antworten zu posten!
Paresh Mayani

das problem kann mit der gleichen antwort gelöst werden;) sein spam ??
Gusgard

3
Wenn Sie in eine Instanz hinter dem Load Balancer wechseln und Anpassungen vornehmen, wird der Zweck von Elastic Beanstalk zunichte gemacht. Was passiert, wenn Sie skalieren und mehr Instanzen erhalten? Tun Sie das bei allen? Manuell?
Fivedogit

1
@fivedogit Wenn Sie sorgfältig lesen, stellen Sie fest, dass er keine Anpassungen durch SSH-Eingaben in die Instanz vorgenommen hat. Er hat nur SSH, um die Datei zu lesen und zu kopieren. Danach verwendet er .ebextensionsin seinem Einsatz, um die Anpassungen korrekt über Elastic Beanstalk selbst vorzunehmen, damit er seinen Zweck nicht verfehlt.
ADTC
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.