Bagaimana server web tahu pasangan kunci mana yang akan digunakan untuk dekripsi SSL?

18

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.

paolo
sumber
Terkait: serverfault.com/questions/126072/...
Ilmari Karonen
Saya setuju bahwa jawabannya sangat mirip, namun saya percaya pertanyaannya sangat berbeda.
paolo

Jawaban:

29

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.

Sven
sumber
2
Jika seseorang masih menggunakan XP, toh mereka tidak pantas mengunjungi situs saya;)
paolo
2
perhatian besar harus diambil ketika membatasi klien dengan cara ini (browser bukan orang). Banyak, banyak bisnis tidak meng-upgrade windows dengan sangat baik, dan hal yang sama berlaku dengan beberapa vendor ponsel android, mereka biasanya tidak meng-upgrade OS mereka sama sekali (atau setidaknya tidak banyak). Windows XP pada 8% dan pangsa pasar Android pra 4.4 tampak besar.
coteyr
Jika server tidak memiliki dukungan SNI, dimungkinkan untuk menggunakan proxy dengan dukungan SNI di depan server tanpa dukungan SNI.
kasperd
1
@coteyr Mayoritas pengguna XP yang tersisa ada di Cina. Untungnya, sangat sedikit penggunaan di tempat lain, setidaknya di Internet.
Michael Hampton
7

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.

v6ak
sumber
"Permintaan HTTP tidak dienkripsi oleh kunci publik server. Itu dienkripsi oleh sandi simetris menggunakan kunci yang dinegosiasikan dalam jabat tangan sebelumnya." Tidak tahu itu, terima kasih untuk head-up! Saya tahu, bagaimanapun, bahwa TLS menggantikan SSL, namun kami terjebak dengan istilah konvensional "sertifikat SSL", oleh karena itu saya menyebutkan.
paolo
Saya tahu bahwa istilah seperti "sertifikat SSL" cukup sering untuk TLS. Saya mencoba menghindarinya, tetapi saya tidak yakin apakah Anda (atau orang lain) tahu istilah TLS.
v6ak