Itu pertanyaan yang cukup besar =) Di bawah ini adalah ikhtisar tingkat tinggi HTTPS; berteriak jika ada yang tidak jelas dan saya akan mengisi lebih banyak detail.
Saat Anda menggunakan koneksi HTTPS, crypto kunci publik hanya digunakan selama inisialisasi sesi. Bagian dari inisialisasi itu adalah pertukaran aman dari kunci pribadi yang dibagikan yang kemudian digunakan untuk enkripsi simetris. Alasannya adalah karena enkripsi asimetris (kunci publik) jauh lebih lambat daripada enkripsi kunci simetris, karena matematika yang terlibat.
Jabat tangan SSL
Pada level yang sangat tinggi, protokolnya kira-kira seperti ini:
Klien mengirimkan pesan "HELLO" awal, yang berisi versi ssl yang ingin digunakan, serangkaian bit pseudo-acak (sebut saja B1) dan daftar berbagai cipher yang didukungnya.
Server merespons dengan pesan "HELLO" sendiri, string pseudo-acak bit (sebut B2), cipher yang dipilihnya (biasanya cipher terkuat dari daftar yang dikirim klien yang didukung server), dan servernya sertifikat yang berisi kunci publiknya (sebut saja itu k ).
Klien kemudian menggunakan sertifikat untuk mengotentikasi server (lihat di bawah) dan membuat "rahasia premaster" - string lain bit pseduo-acak yang akan kita sebut S.
Jika klien senang dengan hasil otentikasi server, itu mengenkripsi rahasia premaster S dengan kunci publik server k , dan mengirimkannya ke server (S sendiri dienkripsi, tetapi koneksi masih belum).
Pada titik ini, server dan klien berbagi tiga string bit - B1, B2 dan S. B1 dan B2 dikirim dengan jelas - S dienkripsi, dan dengan demikian, dengan asumsi kunci privat server benar-benar pribadi, hanya diketahui oleh klien dan server.
Baik klien dan server kemudian menggunakan tiga string ini untuk membangun kunci sesi - string yang hanya diketahui oleh mereka, dan dapat digunakan sebagai kunci dalam cipher simetris yang dipilih sebelumnya.
Klien dan server kemudian bertukar pesan yang menunjukkan mereka mengubah protokol, dan semua pesan berikutnya dienkripsi (simetris, dengan kunci dihitung di atas).
Otentikasi server
Ketika klien menerima pesan HELLO server, ia perlu memastikan bahwa itu berbicara ke server yang dianggapnya pesan itu. Sertifikat dan kunci server digunakan untuk membangun kepercayaan ini.
Semua sertifikat digital adalah pihak ketiga yang menyatakan "entitas ini memegang kunci pribadi yang terkait dengan kunci publik ini, yang tertanam dalam sertifikat ini". Organisasi seperti Verisign akan membuat pernyataan ini - dengan harga tertentu. Alasan orang membayar Verisign dan lain-lain untuk sertifikat adalah bahwa Verisign mengalami kesulitan untuk mendapatkan sertifikat perantara mereka tertanam di sebagian besar browser umum.
Jadi, ketika klien menerima server HELLO, ia akan melakukan pemeriksaan berikut:
- Apakah tanggal hari ini termasuk dalam periode validitas sertifikat?
- Apakah nama subjek sertifikat cocok dengan nama server yang saya coba hubungi?
- Apakah nama Penerbit pada sertifikat cocok dengan salah satu CA yang memiliki kunci publik yang saya ketahui?
- Jika demikian, apakah kunci publik yang saya miliki untuk CA ini memvalidasi sertifikat ini?
Jika semua cek lulus, klien menganggap dapat percaya bahwa server adalah yang diharapkan. Itu kemudian mengambil kunci publik (masih k ) keluar dari sertifikat, dan menggunakannya untuk mentransmisikan S ke server dengan aman. Pada titik ini, idenya adalah bahwa Anda memiliki beberapa pernyataan pihak ketiga (Verisign) bahwa kunci publik adalah milik server; jadi hanya server yang akan dapat mendekripsi hasil E (S, k ), dan karenanya hanya server yang dapat menghasilkan kunci yang cocok yang akan Anda gunakan untuk sandi simetris.
Setelah jabat tangan, kepercayaan diri Anda bahwa paket tidak dapat dibaca oleh pihak ketiga harus sama dengan keyakinan Anda pada algoritma simetris yang digunakan.
(Ada tikungan-tikungan bagus lainnya - misalnya alasan penggunaan tiga senar bit adalah untuk mencegah serangan replay. Jika hanya S yang digunakan, penyerang dapat merekam seluruh sesi dan memutarnya kembali pada waktu luang - misalnya, mengulangi instruksi transfer uang berulang dan Dengan klien dan server menghasilkan string pseduo-random tambahan, Anda sangat mengurangi kemungkinan dua jabat tangan SSL independen menghasilkan S. yang sama)