Ini adalah pemahaman saya bahwa ketika Apache menerima permintaan ke salah satu port TCP yang didengarnya (mis. 80, 443), itu akan memutuskan host mana yang diminta dengan melihat header HTTP Host
. Server kemudian akan tahu host virtual mana yang harus mengarahkan permintaan.
Tetapi bagaimana cara kerjanya untuk HTTP melalui SSL / TLS? Karena seluruh permintaan HTTP sedang dienkripsi (setidaknya itulah yang saya yakin telah saya baca di suatu tempat), informasi header hanya dapat dibaca setelah server telah mendekripsi data. Tetapi untuk mendekripsi, perlu mengetahui pasangan kunci mana yang akan digunakan karena Anda dapat menginstal beberapa sertifikat SSL pada server web.
Jadi, bagaimana server mengetahui kunci mana yang dibutuhkan untuk dekripsi?
Tebakan saya :
Saya bisa membayangkan bahwa jabat tangan TLS memberikan informasi yang diperlukan.
Mengenai bendera "kemungkinan duplikat" :
Sementara saya setuju bahwa jawaban untuk pertanyaan terkait dan pertanyaan saya serupa, saya harus mengatakan bahwa pertanyaannya berbeda. Tidak diragukan apakah hosting beberapa situs dengan sertifikat SSL independen mungkin dilakukan. Alih-alih pertanyaan saya membahas aspek teknis yang mendasarinya.
sumber
Jawaban:
Awalnya, server web tidak tahu. Ini adalah alasan bahwa Anda memerlukan alamat IP terpisah untuk setiap vhost SSL yang ingin Anda host di server. Dengan cara ini, server tahu bahwa ketika koneksi masuk pada IP X, ia perlu menggunakan konfigurasi (termasuk sertifikat) untuk vhost terkait.
Ini berubah dengan Indikasi Nama Server , ekstensi TLS yang memang memungkinkan klien untuk menunjukkan nama host yang diperlukan dalam proses jabat tangan. Ekstensi ini digunakan di semua OS modern, tetapi browser atau server lama tidak mendukungnya, jadi jika Anda mengharapkan klien masih menggunakan IE 6 di WinXP, Anda akan kurang beruntung.
sumber
Tampaknya Anda memiliki beberapa kesalahpahaman tentang TLS / SSL. Permintaan HTTP tidak dienkripsi oleh kunci publik server. Itu dienkripsi oleh sandi simetris menggunakan kunci dinegosiasikan di jabat tangan sebelumnya.
Deskripsi singkat tentang jabat tangan TLS: Server dan klien menegosiasikan beberapa ciphersuite, kunci simetris, dan beberapa detail lainnya. Untuk mencegah MITM, server biasanya mengirimkan sertifikat (rantai) ke klien dan mengautentikasi jabat tangan menggunakan kunci dalam sertifikat. (Ada juga beberapa varian lain, mis. Otentikasi klien atau TLS-PSK, tetapi tidak banyak digunakan dengan HTTP.) Klien dapat memvalidasi sertifikat (dengan cara biasa) atau mengabaikannya.
Meskipun SNI penting ketika menggunakan beberapa sertifikat TLS pada satu IP, tidak penting bagi server untuk dapat mendekripsi permintaan. Tanpa SNI, server tidak tahu rantai sertifikat mana yang harus dikirim, jadi server biasanya memilih satu (mis. Vhost pertama), yang tentu saja bisa salah. Jika server memilih rantai sertifikat yang salah, klien harus menolaknya (sehingga tidak melanjutkan mengirim permintaan HTTP). Namun, jika klien mengabaikan sertifikat (atau jika sertifikat yang tidak valid ditandai sebagai tepercaya untuk situs ini), ia dapat berhasil melanjutkan. Karena kunci simetris yang digunakan untuk enkripsi tidak bergantung pada sertifikat (TLS dirancang juga berfungsi tanpa sertifikat), server dapat mendekripsi.
Hanya sedikit catatan mengapa saya menulis tentang TLS, sementara Anda bertanya tentang SSL: TLS adalah versi baru dari SSL. Semua versi SSL dianggap tidak aman untuk penggunaan umum, jadi kami sebagian besar menggunakan TLS (1.0, 1.1, 1.2) sekarang.
sumber