Mengalihkan EC2 Elastic Load Balancer dari HTTP ke HTTPS

104

Saya ingin mengarahkan semua permintaan HTTP ke permintaan https di ELB . Saya memiliki dua instans EC2. Saya menggunakan nginx untuk server. Saya telah mencoba menulis ulang file conf nginx tanpa hasil. Saya ingin nasihat tentang itu.

Amit Badheka
sumber
1
Tampaknya Internet tidak dapat menyetujui satu solusi tunggal, lengkap, dan berfungsi untuk masalah ini. Semoga Anda bisa mendapatkan bantuan di sini di posting saya . Aku harus melewati rintangan untuk memikirkan ini, akhirnya.
ADTC
1
Ini ans memiliki solusi terbaru, bukan jawaban yang diterima
AsifM

Jawaban:

87

Application Load Balancers AWS sekarang mendukung pengalihan HTTP ke HTTPS asli.

Untuk mengaktifkan ini di konsol, lakukan hal berikut:

  1. Buka Load Balancer Anda di EC2 dan tab "Pendengar"
  2. Pilih "Lihat / edit aturan" pada pemroses HTTP Anda
  3. Hapus semua aturan kecuali yang default (bawah)
  4. Edit aturan default: pilih "Alihkan ke" sebagai tindakan, biarkan semuanya sebagai default dan masukkan "443" sebagai porta.

Aturan pendengar pengalihan asli

Hal yang sama dapat dicapai dengan menggunakan CLI seperti yang dijelaskan di sini .

Anda juga dapat melakukan ini di Cloudformation, di mana Anda perlu menyiapkan objek Pendengar seperti ini:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443

Jika Anda masih menggunakan Classic Load Balancers, gunakan salah satu konfigurasi NGINX yang dijelaskan oleh yang lain.

Ulli
sumber
1
Sangat berguna untuk mengetahui lebih mudah sekarang. Tetapi ini akan menjadi jawaban yang lebih baik dengan lebih banyak info tentang apa yang harus dikonfigurasi daripada hanya tautan.
John Rees
1
@JohnRees mengedit jawaban yang sesuai, semoga ini membantu
Ulli
Bagus. Saya memilih Anda untuk membuat Anda menjadi nol. Anda berhak mendapatkan lebih.
John Rees
2
@florian Anda tampaknya menggunakan Classic Load Balancer. Beralih ke Application Load Balancer untuk mendapatkan opsi itu
Ulli
bagaimana cara menetapkan Application Load Balancer ke instans saya? (karena tidak ada instancestab)
Florian
107

ELB menyetel X-Forwarded-Protoheader, Anda dapat menggunakannya untuk mendeteksi apakah permintaan asli adalah HTTP dan kemudian dialihkan ke HTTPS.

Anda dapat mencoba ini di serverkonfigurasi Anda :

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

Lihat dokumen ELB .

Dmitry Mukhin
sumber
3
Di mana seseorang melakukan konfigurasi ini?
ericpeters0n
2
@ ericpeters0n potongan dalam jawabannya adalah untuk nginxkonfigurasi, tetapi prinsipnya dapat diterapkan ke server web mana pun.
Dmitry Mukhin
1
jika Anda menggunakan pohon kacang dengan penumpang-mandiri, ikuti tautan ini untuk mengetahui cara mengubah konfigurasi nginx. qiita.com/tak_nishida/items/cf30a2d373744943b943
Yeonho
3
Pastikan Anda memiliki pemroses HTTP dan HTTPS di penyeimbang beban Anda.
Gavin Palmer
1
@ Ronald, dengan conf server dalam tanggapan yang saya maksud adalah server nginx pada contoh ec2 yang berjalan di belakang ELB.
Dmitry Mukhin
34

Saya memiliki masalah yang sama, dalam situasi saya HTTPS ditangani sepenuhnya oleh ELB dan saya tidak tahu domain sumber saya sebelumnya, jadi saya akhirnya melakukan sesuatu seperti:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}

Dan tentu saja mengarahkan ELB 'https' ke port instance 80 dan kemudian 'http' route ke port instance 81.

TylerFowler
sumber
3
Ini jenius.
Andy Hayden
2
@CodyBugstein ini adalah konfigurasi nginx, jika Anda memilikinya
timurso
@timurso jika Anda punya apa?
CodyBugstein
@CodyBugstein jika Anda memiliki nginx di depan aplikasi Anda (saya, misalnya, tidak - ini diarahkan langsung ke container yang menjalankan ExpressJS)
timurso
Kemana nginx akan pergi? Di dalam ELB? Di dalam EC2? Apakah ini dikonfigurasi di Elastic Beanstalk?
CodyBugstein
16

Amazon Elastic Load Balancer (ELB) mendukung header HTTP yang disebut X-FORWARDED-PROTO. Semua permintaan HTTPS melalui ELB akan memiliki nilai X-FORWARDED-PROTO yang sama dengan "HTTPS". Untuk permintaan HTTP, Anda dapat memaksa HTTPS dengan menambahkan aturan penulisan ulang sederhana berikut. Bagi saya ini berfungsi dengan baik!

Apache

Anda dapat menambahkan baris berikut di file .htaccess Anda:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

Atau jika Anda menggunakan vhost.conf untuk mengelola beberapa domain di server web EC2 yang sama, maka Anda dapat menambahkan berikut ini ke vhost.conf (tambahkan ke domain yang ingin Anda gunakan https untuk itu):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

IIS

Instal modul IIS Url-Rewrite, menggunakan konfigurasi GUI, tambahkan pengaturan berikut:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>

Baca lebih lanjut di sini

Iman Sedighi
sumber
Kami mengalami masalah saat instance kami mengalihkan lalu lintas http normal karena tajuknya tidak ada. Saya mengatasinya dengan membuat kondisi:RewriteCond %{HTTP:X-Forwarded-Proto} !(https|^$)
natronite
Ini menyebabkan pengalihan tak terbatas. Saya menggunakan IIS dengan server windows.
Ini jebakan
@ Itatrap: Untuk IIS jika tidak berhasil, coba skrip di URL ini: stephen.genoprime.com/2012/01/01/aws-elb-ssl-with-iis.html
Iman Sedighi
5

Solusi htaccess di atas menyebabkan health check ELB gagal. Saya mengalami kesulitan menemukan solusinya sampai saya menemukan artikel online di mana seseorang memiliki masalah yang sama dengan saya. Solusinya adalah menambahkan ini ke awal file htaccess sebagai gantinya:

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

Untuk mengizinkan ini dan permintaan lokal lainnya melalui HTTP sambil mengalihkan permintaan eksternal melalui ELB ke HTTPS, sesuaikan kondisi penulisan ulang agar cocok dengan http, bukan pencocokan negatif di https.

Sumber: Mengalihkan HTTP ke HTTPS dengan AWS dan ELB

omikes
sumber
"sesuaikan kondisi penulisan ulang agar cocok di http, bukan di pencocokan negatif di https", itulah bagian yang saya coba perbaiki. Terima kasih!
Merricat
4

Ini mungkin bukan solusi yang mungkin Anda cari, tetapi opsi lainnya adalah menggunakan AWS CloudFront selain ELB. CloudFront memberikan opsi untuk mengalihkan semua lalu lintas HTTP yang masuk ke HTTPS.

MojoJojo
sumber
3

Saya punya masalah aneh dengan konfigurasi nginx dan ELB. Pengaturan saya menyertakan 3 layanan berbeda di dalam satu nginx di belakang ELB. Dan saya memiliki masalah konten campuran: ketika permintaan Anda ke ELB adalah https, tetapi di dalam ELB http saja, dan server membuat jalur relatif ke statis menggunakan http, jadi browser gagal dengan masalah 'konten campuran'. Dan saya harus membuat solusi untuk kedua http / https bekerja tanpa pengalihan.

Berikut adalah konfigurasi yang terletak di nginx/conf.d/folder:

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

Artinya kita akan mengetahui apa itu protokol klien yang sebenarnya. Seperti yang Anda lihat, kami akan memilikinya di $switchvar. Dan saat ini Anda menggunakan ini di semua lokasi di mana Anda membutuhkannya:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

Dengan pengaturan HTTPS, aplikasi php akan secara otomatis mendeteksi protokol yang benar dan dengan hati-hati membangun jalur relatif untuk mencegah masalah konten campuran.

Salam Hormat.

Oleg Mykolaichenko
sumber
3

Berdasarkan jawaban @ Ulli Jika Anda ingin mengkonfigurasinya menggunakan Terraform , berikut adalah contoh>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Sumber

Mathieu Lescaudron
sumber
-2

Buat file .ebextensions/00_forward_http_to_https.configdengan konten berikut:

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

Pastikan untuk mengatur variabel lingkungan APP_URL dari konsol manajemen AWS sebelumnya.

Andres
sumber
Bagaimana saya bisa melakukan ini saat menyeimbangkan koneksi TCP dengan ELB?
booming
1
Saya tidak melihat di mana jawaban Anda sesuai dengan pertanyaan ... Anda berbicara tentang tangkai kacang elastis dan pertanyaannya adalah tentang nginx di dalam EC2.
jvarandas