Minta Nginx menolak nama server yang tidak dikenal melalui HTTPS

7

Saya punya instance Nginx menggunakan SNI untuk melayani beberapa domain HTTPS dari satu IP.

Satu-satunya kesalahan dengan pengaturan adalah bahwa Nginx merespons dengan domain pertama (bertindak sebagai default) setiap kali URL untuk IP telanjang server, atau domain yang terdaftar di IP yang tidak ada blok server HTTPS yang sesuai, diminta. Dalam hal ini saya lebih suka mengembalikan standar 403 Forbidden - Saya akan membuat blok server default untuk melakukan ini, tetapi saya tidak bisa melihat jalan di sekitar peringatan ketidakcocokan sertifikat klien.

(Bagaimana c | C) saya mengkonfigurasi Nginx untuk menolak permintaan ke domain tidak dikenal / tidak terdefinisi tanpa perlu menentukan sertifikat ssl tertentu yang akan mengganggu browser? (yaitu saya perlu Nginx untuk menolak permintaan dengan 403 sebelum mengecewakan klien dengan sertifikat "buruk" - dari POV klien ini harus identik dengan kasus di mana tidak ada blok server HTTPS yang didefinisikan sama sekali.)

Carlton Gibson
sumber

Jawaban:

7

Pertanyaan ini sangat mirip dengan yang saya jawab kemarin: nginx dan SNI: apakah mungkin untuk secara otomatis menyelesaikan sertifikat SSL dengan nama domain

Tidak mungkin untuk menolak koneksi sebelum pengguna melihat pesan sertifikat yang buruk di browser-nya. Pada saat Nginx mungkin mengembalikan jawaban HTTP 403, jabat tangan SSL selesai dan untuk menyelesaikan jabat tangan, browser harus menerima sertifikat yang disediakan. Anda hanya dapat menolak koneksi setelah pengguna menerima sertifikat dengan menyiapkan server default:

server {
    listen 433 default_server ssl;
    ssl_certificate       common.crt;
    ssl_certificate_key   common.key;
    return 403;
}

Namun, sebagian besar browser terbaru mendukung Indikasi Nama Server dan jika Anda memiliki set sertifikat untuk setiap vhost, sangat tidak mungkin bagi pengguna normal untuk melihat pesan itu.

Dimungkinkan untuk menolak koneksi tanpa nama host yang valid yang ditunjukkan oleh SSL dengan iptables tetapi itu mungkin cukup rumit dan tidak akan sesuai dengan standar apa pun.

Informasi yang diperbarui: Dimungkinkan untuk return 444membatalkan koneksi tcp segera sebelum kesalahan sertifikat ditampilkan.

xblax
sumber
Dengan menggunakan SNI, Anda secara teoritis dapat membatalkan koneksi ketika tidak ada sertifikat untuk nama domain yang diberikan, yang akan lebih baik daripada menampilkan kesalahan sertifikat. Apakah Anda tahu bagaimana melakukan ini?
Yogu
Ya, saya menemukan kemungkinan return 444untuk membatalkan koneksi tcp sebelum kesalahan cert ditampilkan.
xblax
@xblax Bisakah Anda memberi tahu kami BAGAIMANA mengembalikan 444 sebelum sertifikat ditampilkan? Idealnya saya tidak akan menyia-nyiakan sumber daya pada jabat tangan untuk permintaan ke server_name yang saya tidak tahu. SNI harus mengungkapkan nama yang diminta sebelum mendekripsi permintaan.
Static Storm
0

Jika domain Anda adalah subdomain dari master yang sama (* .example.com), Anda dapat menggunakan sertifikat wildcard. Gagal itu, saya tidak berpikir Anda bisa menyediakan sertifikat apa pun browser akan senang dengan.

Chris Nava
sumber
Hai, Chris. Saya menghargai poin wildcard tapi bukan itu yang saya tanyakan. Ya, browser tidak akan menyukai sertifikat TETAPI apakah ada cara untuk menolak koneksi berdasarkan nama server yang diminta? (Saya curiga tidak, tapi ini sepertinya tempat untuk bertanya ... :)
Carlton Gibson
Asumsi yang belum diuji -> Anda harus menyediakan sertifikat yang valid atau browser akan menganggap koneksi tidak aman. Oleh karena itu browser tidak akan bertindak pada pengalihan yang Anda kirim sampai pengguna mengizinkan penggantian. Satu-satunya cara yang dapat saya pikirkan untuk secara otomatis melakukan override adalah dengan memberikan sertifikat yang valid. :-(
Chris Nava