Saya memiliki server web dengan banyak server virtual. Hanya 1 yang merupakan SSL. Masalahnya adalah, karena tidak ada blok server catchall yang mendengarkan SSL, setiap permintaan https ke situs lain dilayani oleh 1 blok SSL.
Konfigurasi saya, pada dasarnya, terlihat seperti ini:
# the catch all
server {
listen 80 default;
# I could add this, but since I have no default cert, I cannot enable SSL,
# and this listen ends up doing nothing (apparently).
# listen 443;
server_name _;
# ...
}
# some server
server {
listen 80;
server_name server1.com;
# ...
}
# some other server ...
server {
listen 80;
server_name server2.com;
# ...
}
# ... and it's https equivalent
server {
listen 443;
ssl on;
server_name server2.com;
# ...
}
Sekarang karena tidak ada pendengar default untuk 443, permintaan seperti https://server1.com
akan berakhir dilayani oleh server2.com
blok https. Ini mengikuti logika untuk server_name
dalam dokumen.
Jika tidak ada kecocokan, blok server {...} di file konfigurasi akan digunakan berdasarkan urutan berikut:
- blok server dengan arahan mendengarkan yang cocok ditandai sebagai [default | default_server]
- blok server pertama dengan arahan mendengarkan yang cocok (atau mendengarkan secara implisit 80;)
Apa solusi yang disukai untuk masalah ini? Apakah saya perlu mengatur sertifikat dummy untuk tangkapan saya semua blok server supaya saya bisa mendengarkan 443 dan menangani permintaan yang buruk? Apakah ada parameter yang saya tidak tahu yang memaksa kecocokan hostname yang tepat dengan server
?
Jawaban:
Tidak mungkin. Sambungan dari klien yang masuk ke https://foo.example.com/ tidak dapat diterima oleh apa pun kecuali sertifikat SSL dengan "foo.example.com" sebagai salah satu namanya. Tidak ada peluang untuk mengarahkan ulang sampai koneksi SSL diterima.
Jika Anda mengonfigurasi setiap situs untuk SSL, pengguna yang mengklik kesalahan sertifikat akan mendapatkan situs yang mereka minta. Jika Anda mengonfigurasi situs "tangkap semua" untuk SSL yang hanya menyediakan halaman kesalahan dan mengkonfigurasi hosting virtual berbasis nama untuk satu situs yang seharusnya mendukung SSL, Anda bisa melayani halaman kesalahan untuk klien.
Hosting virtual SSL dan HTTP tidak bisa bermain bersama dengan baik.
sumber
Satu-satunya cara adalah membuat sertifikat SSL yang ditandatangani sendiri dan menggunakannya untuk mendapatkan kontrol atas permintaan https yang masuk. Anda dapat membuat sertifikat SSL yang ditandatangani sendiri dalam beberapa langkah sederhana yang diuraikan dalam posting ini .
Katakanlah Anda membuat sertifikat yang ditandatangani sendiri dengan nama file server.crt. Anda kemudian akan menambahkan yang berikut ini di konfigurasi nginx Anda:
Anda masih akan mendapatkan pesan peringatan SSL peramban, tetapi setidaknya Anda akan memiliki kendali atas apa yang terjadi selanjutnya.
sumber
Tambahkan catch-all server block dan kembalikan kode status 444. Ia memberi tahu nginx untuk menutup koneksi sebelum mengirim data apa pun.
sumber
Saat ini Anda dapat menggunakan ekstensi Indikasi Nama Server TLS (SNI, RFC 6066). Pendengar HTTPS akan dapat mengenali nama domain sebelum melayani sertifikat yang sesuai.
Ini berarti bahwa Anda harus memiliki sertifikat untuk SEMUA domain Anda, dan ketika SNI digunakan untuk mengenali salah satu domain lain, Anda bisa menggunakan HTTP 301 redirect ke HTTP versi non-terenkripsi kecuali nama server cocok dengan satu yang membutuhkan enkripsi.
Informasi lebih lanjut tentang SNI tersedia di dokumentasi nginx http://nginx.org/en/docs/http/configuring_https_servers.html
sumber
Petakan nama host yang diminta untuk nama host yang valid di
http {}
blok:Dan kemudian di
server {}
blok itu, hentikan koneksi dengan nama host yang salah:Gunakan beberapa peta seperlunya untuk beberapa blok server. Koneksi masih akan dibuat menggunakan salah satu sertifikat Anda tetapi jika blok terakhir ini hadir di setiap blok server yang melayani SSL maka secara efektif Anda akan "memblokir" koneksi dengan nama host yang tidak valid. Mungkin hanya diperlukan di blok server pertama tetapi menambahkannya ke setiap blok server akan memastikan bahwa pesanan tidak masalah.
The
$ssl_server_name
variabel hadir dalam nginx 1,7 atau lebih besar.sumber
Inilah cara saya memecahkan masalah:
openssl req -nodes -x509 -newkey rsa:4096 -keyout self_key.pem -out self_cert.pem -days 3650
cp self*.pem /etc/nginx/ssl/
Apa yang akan dilakukan: ia akan memberi Anda peringatan (tidak ada jalan lain) di server mana pun yang tidak memiliki sertifikat sendiri, tetapi peringatan itu tidak akan menyebutkan nama sertifikat yang salah. Jika pengguna mengklik "kunjungi pula" mereka akan diarahkan ke versi non-ssl dari situs yang mereka ketikkan.
peringatan :
jika situs Anda yang mengaktifkan SLL hanya menentukan
www.example.com
(dan tidakexample.com
) maka rute tangkap-semua Anda akan berakhirhttps://example.com
dengan sertifikat yang ditandatangani sendiri dan peringatan yang sesuai.sumber
Redirect ke http:
Return 404 :
sumber