Bagaimana cara kerja SSL?

144

Bagaimana cara kerja SSL?

Di mana sertifikat diinstal pada klien (atau browser?) Dan server (atau server web?)?

Bagaimana proses kepercayaan / enkripsi / otentikasi dimulai saat Anda memasukkan URL ke browser dan mendapatkan halaman dari server?

Bagaimana protokol HTTPS mengenali sertifikat? Mengapa HTTP tidak dapat berfungsi dengan sertifikat jika sertifikatlah yang melakukan semua pekerjaan kepercayaan / enkripsi / otentikasi?

Vicky
sumber
24
Saya pikir ini adalah pertanyaan yang masuk akal - memahami cara kerja SSL adalah langkah 1, menerapkannya dengan benar adalah langkah 2 hingga langkah tak terbatas.
synthesizerpatel
6
@StingyJack Jangan menjadi nazi kebijakan di sini. Orang-orang datang mencari bantuan. Jangan menyangkal semua bantuan karena Anda menemukan pertanyaan tersebut tidak sepenuhnya sesuai dengan aturan.
Koray Tugay
1
@KorayTugay - no menolak bantuan. Ini memang termasuk dalam Keamanan atau Sysadmin di mana ia lebih ditargetkan, tetapi OP biasanya akan mendapat manfaat di forum ini dengan menambahkan sedikit konteks pemrograman daripada memposting pertanyaan TI umum. Berapa banyak orang yang pertanyaannya ditutup ketika mereka tidak terikat pada masalah pemrograman tertentu? Mungkin terlalu banyak, maka OP saya mendorong untuk membuat asosiasi itu.
StingyJack

Jawaban:

146

Catatan: Saya menulis jawaban asli saya dengan sangat tergesa-gesa, tetapi sejak saat itu, ini telah menjadi pertanyaan / jawaban yang cukup populer, jadi saya telah mengembangkannya sedikit dan membuatnya lebih tepat.

Kemampuan TLS

"SSL" adalah nama yang paling sering digunakan untuk merujuk pada protokol ini, tetapi SSL secara khusus mengacu pada protokol berpemilik yang dirancang oleh Netscape pada pertengahan 90-an. "TLS" adalah standar IETF yang didasarkan pada SSL, jadi saya akan menggunakan TLS dalam jawaban saya. Saat ini, kemungkinan besar hampir semua koneksi aman Anda di web benar-benar menggunakan TLS, bukan SSL.

TLS memiliki beberapa kemampuan:

  1. Enkripsi data lapisan aplikasi Anda. (Dalam kasus Anda, protokol lapisan aplikasi adalah HTTP.)
  2. Otentikasi server ke klien.
  3. Otentikasi klien ke server.

# 1 dan # 2 sangat umum. # 3 kurang umum. Anda tampaknya berfokus pada # 2, jadi saya akan menjelaskan bagian itu.

Autentikasi

Server mengautentikasi dirinya sendiri ke klien menggunakan sertifikat. Sertifikat adalah sekumpulan data [1] yang berisi informasi tentang situs web:

  • Nama domain
  • Kunci publik
  • Perusahaan yang memilikinya
  • Kapan diterbitkan
  • Saat habis masa berlakunya
  • Siapa yang mengeluarkannya
  • Dll

Anda dapat mencapai kerahasiaan (# 1 di atas) dengan menggunakan kunci publik yang disertakan dalam sertifikat untuk mengenkripsi pesan yang hanya dapat didekripsi oleh kunci privat terkait, yang harus disimpan dengan aman di server itu. [2] Sebut saja key pair ini KP1, agar nantinya kita tidak bingung. Anda juga dapat memverifikasi bahwa nama domain pada sertifikat cocok dengan situs yang Anda kunjungi (# 2 di atas).

Tetapi bagaimana jika musuh dapat memodifikasi paket yang dikirim ke dan dari server, dan bagaimana jika musuh itu memodifikasi sertifikat yang diberikan kepada Anda dan memasukkan kunci publiknya sendiri atau mengubah detail penting lainnya? Jika itu terjadi, musuh dapat mencegat dan mengubah pesan apa pun yang Anda anggap dienkripsi dengan aman.

Untuk mencegah serangan ini, sertifikat ditandatangani secara kriptografis oleh kunci privat orang lain sedemikian rupa sehingga tanda tangan dapat diverifikasi oleh siapa saja yang memiliki kunci publik yang sesuai. Mari kita sebut pasangan kunci ini KP2, untuk memperjelas bahwa ini bukan kunci yang sama yang digunakan server.

Otoritas Sertifikat

Jadi siapa yang membuat KP2? Siapa yang menandatangani sertifikat?

Sedikit menyederhanakan, otoritas sertifikat membuat KP2, dan mereka menjual layanan menggunakan kunci pribadinya untuk menandatangani sertifikat untuk organisasi lain. Misalnya, saya membuat sertifikat dan saya membayar perusahaan seperti Verisign untuk menandatanganinya dengan kunci pribadi mereka. [3] Karena tidak ada selain Verisign yang memiliki akses ke kunci pribadi ini, tidak ada dari kita yang dapat memalsukan tanda tangan ini.

Dan bagaimana saya secara pribadi mendapatkan kunci publik di KP2 untuk memverifikasi tanda tangan itu?

Kami telah melihat bahwa sertifikat dapat menyimpan kunci publik - dan ilmuwan komputer menyukai rekursi - jadi mengapa tidak memasukkan kunci publik KP2 ke dalam sertifikat dan mendistribusikannya seperti itu? Ini terdengar sedikit gila pada awalnya, tetapi sebenarnya itulah cara kerjanya. Melanjutkan contoh Verisign, Verisign menghasilkan sertifikat yang menyertakan informasi tentang siapa mereka, jenis hal apa yang boleh mereka tanda tangani (sertifikat lain), dan kunci publiknya.

Sekarang jika saya memiliki salinan sertifikat Verisign tersebut, saya dapat menggunakannya untuk memvalidasi tanda tangan pada sertifikat server untuk situs web yang ingin saya kunjungi. Mudah kan ?!

Tidak terlalu cepat. Saya harus mendapatkan sertifikat Verisign dari suatu tempat . Bagaimana jika seseorang memalsukan sertifikat Verisign dan meletakkan kunci publiknya sendiri di sana? Kemudian mereka dapat memalsukan tanda tangan pada sertifikat server, dan kami kembali ke tempat kami memulai: serangan man-in-the-middle.

Rantai Sertifikat

Terus berpikir secara rekursif, tentu saja kami dapat memperkenalkan sertifikat ketiga dan pasangan kunci ketiga (KP3) dan menggunakannya untuk menandatangani sertifikat Verisign. Kami menyebutnya rantai sertifikat: setiap sertifikat dalam rantai digunakan untuk memverifikasi sertifikat berikutnya. Mudah-mudahan Anda sudah dapat melihat bahwa pendekatan rekursif ini hanyalah penyu / sertifikat sepenuhnya. Dimana berhenti?

Karena kami tidak dapat membuat sertifikat dalam jumlah tak terbatas, rantai sertifikat jelas harus berhenti di suatu tempat , dan itu dilakukan dengan menyertakan sertifikat dalam rantai yang ditandatangani sendiri .

Saya akan berhenti sejenak saat Anda mengambil potongan materi otak dari kepala Anda yang meledak. Ditandatangani sendiri ?!

Ya, di akhir rantai sertifikat (alias "root"), akan ada sertifikat yang menggunakan pasangan kunci itu sendiri untuk menandatangani sendiri. Ini menghilangkan masalah rekursi tak terbatas, tetapi tidak memperbaiki masalah otentikasi. Siapa pun dapat membuat sertifikat yang ditandatangani sendiri yang bertuliskan apa pun di atasnya, seperti saya dapat membuat ijazah Princeton palsu yang mengatakan bahwa saya mengambil tiga jurusan politik, fisika teoretis, dan menendang pantat terapan dan kemudian menandatangani nama saya sendiri di bagian bawah.

Solusi [agak tidak menarik] untuk masalah ini hanya dengan memilih beberapa set sertifikat yang ditandatangani sendiri yang Anda percayai secara eksplisit. Misalnya, saya mungkin berkata, "Saya percaya sertifikat yang ditandatangani sendiri oleh Verisign".

Dengan kepercayaan eksplisit tersebut, sekarang saya dapat memvalidasi seluruh rantai sertifikat. Tidak peduli berapa banyak sertifikat yang ada dalam rantai tersebut, saya dapat memvalidasi setiap tanda tangan hingga ke akar. Ketika saya sampai ke root, saya dapat memeriksa apakah sertifikat root itu adalah salah satu yang saya percayai secara eksplisit. Jika demikian, maka saya bisa mempercayai seluruh rantai.

Kepercayaan yang Diberikan

Autentikasi di TLS menggunakan sistem kepercayaan yang diberikan . Jika saya ingin menyewa montir mobil, saya mungkin tidak mempercayai mekanik sembarangan yang saya temukan. Tapi mungkin teman saya menjamin mekanik tertentu. Karena saya mempercayai teman saya, maka saya dapat mempercayai mekanik itu.

Saat Anda membeli komputer atau mengunduh browser, ia dilengkapi dengan beberapa ratus sertifikat dasar yang dipercayai secara eksplisit. [4] Perusahaan yang memiliki dan mengoperasikan sertifikat tersebut dapat memberikan kepercayaan tersebut kepada organisasi lain dengan menandatangani sertifikat mereka.

Ini jauh dari sistem yang sempurna. Terkadang CA mungkin mengeluarkan sertifikat secara keliru. Dalam kasus tersebut, sertifikat mungkin perlu dicabut. Pencabutan rumit karena sertifikat yang diterbitkan akan selalu benar secara kriptografis; protokol out-of-band diperlukan untuk mengetahui sertifikat valid mana yang sebelumnya telah dicabut. Dalam praktiknya, beberapa protokol ini tidak terlalu aman, dan banyak browser yang tidak memeriksanya.

Terkadang seluruh CA disusupi. Misalnya, jika Anda membobol Verisign dan mencuri kunci penandatanganan root mereka, Anda dapat memalsukan sertifikat apa pun di dunia. Perhatikan bahwa ini tidak hanya memengaruhi pelanggan Verisign: meskipun sertifikat saya ditandatangani oleh Thawte (pesaing Verisign), itu tidak masalah. Sertifikat saya masih dapat dipalsukan menggunakan kunci penandatanganan yang telah disusupi dari Verisign.

Ini bukan hanya teoretis. Itu terjadi di alam liar. DigiNotar terkenal diretas dan kemudian bangkrut. Comodo juga diretas , tetapi entah mengapa mereka tetap beroperasi hingga hari ini.

Meskipun CA tidak secara langsung disusupi, ada ancaman lain dalam sistem ini. Misalnya, pemerintah menggunakan paksaan hukum untuk memaksa CA menandatangani sertifikat palsu. Majikan Anda dapat memasang sertifikat CA mereka sendiri di komputer karyawan Anda. Dalam berbagai kasus ini, lalu lintas yang Anda harapkan "aman" sebenarnya dapat dilihat / diubah sepenuhnya oleh organisasi yang mengontrol sertifikat tersebut.

Beberapa penggantian telah disarankan, termasuk Konvergensi , TACK , dan DANE .

Catatan Akhir

[1] Data sertifikat TLS diformat sesuai dengan standar X.509 . X.509 didasarkan pada ASN.1 ("Notasi Sintaks Abstrak # 1"), yang berarti bahwa ini bukan format data biner. Oleh karena itu, X.509 harus dienkode ke dalam format biner. DER dan PEM adalah dua pengkodean paling umum yang saya ketahui.

[2] Dalam praktiknya, protokol sebenarnya beralih ke sandi simetris, tetapi itu adalah detail yang tidak relevan dengan pertanyaan Anda.

[3] Mungkin, CA benar-benar memvalidasi siapa Anda sebelum menandatangani sertifikat Anda. Jika mereka tidak melakukannya, saya dapat membuat sertifikat untuk google.com dan meminta CA untuk menandatanganinya. Dengan sertifikat tersebut, saya dapat mengelola koneksi "aman" apa pun ke google.com. Oleh karena itu, langkah validasi merupakan faktor yang sangat penting dalam pengoperasian CA. Sayangnya, tidak terlalu jelas seberapa ketat proses validasi ini di ratusan CA di seluruh dunia.

[4] Lihat daftar CA terpercaya Mozilla .

Mark E. Haase
sumber
Apa itu kunci pribadi?
Koray Tugay
Anda lupa menyebutkan bahwa kunci publik adalah bagian dari file sertifikat yang dikirim ke situs web untuk mengecam data yang dienkripsi server Anda.
mamdouh alramadan
Terima kasih @mamdouhalramadan. Saya telah mengedit untuk menyebutkan itu.
Mark E. Haase
2
@mamdouhalramadan "kunci publik ... dikirim ke situs web untuk mendekripsi data". Bagaimana kunci publik digunakan untuk mendekripsi data?
Teddy
@ateddy Anda benar. Tidak bisa. Kunci publik hanya digunakan untuk otentikasi. Klaim di sini bahwa pasangan kunci juga digunakan untuk enkripsi dan dekripsi tidak benar. Kunci sesi yang dinegosiasikan dengan aman digunakan untuk itu.
Marquis dari Lorne
55

HTTPS adalah kombinasi HTTP dan SSL (Secure Socket Layer) untuk menyediakan komunikasi terenkripsi antara klien (browser) dan server web (aplikasi dihosting di sini).

Mengapa ini dibutuhkan?

HTTPS mengenkripsi data yang dikirimkan dari browser ke server melalui jaringan. Jadi, tidak ada yang bisa mengendus data selama transmisi.

Bagaimana koneksi HTTPS dibuat antara browser dan server web?

  1. Browser mencoba untuk terhubung ke https://payment.com .
  2. server payment.com mengirimkan sertifikat ke browser. Sertifikat ini menyertakan kunci publik server payment.com, dan beberapa bukti bahwa kunci publik ini sebenarnya milik payment.com.
  3. Browser memverifikasi sertifikat untuk mengonfirmasi bahwa ia memiliki kunci publik yang tepat untuk payment.com.
  4. Browser memilih kunci simetris baru acak K yang akan digunakan untuk koneksi ke server payment.com. Ini mengenkripsi K di bawah kunci publik payment.com.
  5. payment.com mendekripsi K menggunakan kunci pribadinya. Sekarang browser dan server pembayaran tahu K, tetapi tidak ada yang tahu.
  6. Setiap browser ingin mengirim sesuatu ke payment.com, itu mengenkripsinya di bawah K; server payment.com mendekripsinya setelah diterima. Kapan pun server payment.com ingin mengirim sesuatu ke browser Anda, itu mengenkripsinya di bawah K.

Aliran ini dapat diwakili oleh diagram berikut: masukkan deskripsi gambar di sini

sanjay_kv
sumber
1
Bagian tentang mengenkripsi dan mengirim kunci sesi dan mendekripsinya di server sudah lengkap dan benar-benar sampah. Kunci sesi tidak pernah dikirim sama sekali: kunci ini dibuat melalui algoritma negosiasi kunci aman. Silakan periksa fakta Anda sebelum memposting omong kosong seperti ini. RFC 2246.
Marquis dari Lorne
Mengapa browser tidak menggunakan kunci publik server untuk mengenkripsi data saat mempostingnya ke server, alih-alih membuat kunci simetris baru acak K pada langkah 4?
KevinBui
1
@KevinBui Karena mengirim respon dari server akan membutuhkan klien untuk memiliki pasangan kunci, dan karena enkripsi asimetris sangat lambat.
Marquis dari Lorne
3

Saya telah menulis posting blog kecil yang membahas prosesnya secara singkat. Silakan lihat.

Jabat Tangan SSL

Cuplikan kecil dari yang sama adalah sebagai berikut:

"Klien membuat permintaan ke server melalui HTTPS. Server mengirimkan salinan sertifikat SSL + kunci publiknya. Setelah memverifikasi identitas server dengan penyimpanan CA tepercaya lokalnya, klien membuat kunci sesi rahasia, mengenkripsinya menggunakan publik server kunci dan mengirimkannya. Server mendekripsi kunci sesi rahasia menggunakan kunci pribadinya dan mengirimkan pengakuan ke klien. Saluran aman dibuat. "

Abhishek Jain
sumber
"Setelah memverifikasi identitas server dengan penyimpanan CA lokal tepercaya" - ini tidak sepenuhnya benar. Saya dapat menggunakan sertifikat yang ditandatangani sendiri dan HTTPS akan berfungsi - Saya bisa mendapatkan koneksi HTTPS yang aman ke server . Sertifikat tepercaya hanya masuk jika saya ingin memastikan bahwa saya berbicara dengan server yang benar .
Teddy
Bagian tentang mengenkripsi dan mengirim kunci sesi dan mendekripsinya di server sudah lengkap dan benar-benar sampah. Kunci sesi tidak pernah dikirim sama sekali: kunci ini dibuat melalui algoritma negosiasi kunci aman. Silakan periksa fakta Anda sebelum memposting omong kosong seperti ini. RFC 2246.
Marquis dari Lorne
@Teddy Itu tidak benar. Pemeriksaan kepercayaan sertifikat adalah bagian wajib dari SSL. Ini dapat dilewati tetapi biasanya berlaku: sertifikat yang ditandatangani sendiri tidak berfungsi tanpa tindakan khusus dari satu jenis atau lainnya.
Marquis dari Lorne
2

Mehaase sudah menjelaskannya secara rinci. Saya akan menambahkan 2 sen saya ke seri ini. Saya memiliki banyak postingan blog seputar jabat tangan dan sertifikat SSL. Meskipun sebagian besar berkisar pada server web IIS, pos tersebut masih relevan dengan handshake SSL / TLS secara umum. Berikut beberapa untuk referensi Anda:

Jangan perlakukan SERTIFIKAT & SSL sebagai satu topik. Perlakukan mereka sebagai 2 topik berbeda dan kemudian coba lihat siapa yang mereka kerjakan terkait. Ini akan membantu Anda menjawab pertanyaan itu.

Membangun kepercayaan antara pihak yang berkomunikasi melalui Penyimpanan Sertifikat

Komunikasi SSL / TLS hanya berfungsi atas dasar kepercayaan. Setiap komputer (klien / server) di internet memiliki daftar CA Root dan CA Perantara yang dipelihara. Ini diperbarui secara berkala. Selama handshake SSL, ini digunakan sebagai referensi untuk membangun kepercayaan. Misalnya, selama handshake SSL, ketika klien memberikan sertifikat ke server. Server akan mencoba memeriksa apakah CA yang menerbitkan sertifikat ada dalam daftar CA-nya. Jika tidak dapat melakukan ini, ia menyatakan bahwa ia tidak dapat melakukan verifikasi rantai sertifikat. (Ini adalah bagian dari jawabannya. Ini juga melihat AIAuntuk ini.) Klien juga melakukan verifikasi serupa untuk sertifikat server yang diterimanya di Server Hello. Di Windows, Anda dapat melihat penyimpanan sertifikat untuk klien & Server melalui PowerShell. Jalankan di bawah ini dari konsol PowerShell.

PS Cert:> ls Lokasi: CurrentUser StoreNames: {TrustedPublisher, ClientAuthIssuer, Root, UserDS ...}

Lokasi: LocalMachine StoreNames: {TrustedPublisher, ClientAuthIssuer, Remote Desktop, Root ...}

Browser seperti Firefox dan Opera tidak bergantung pada OS yang mendasari untuk manajemen sertifikat. Mereka memelihara penyimpanan sertifikat terpisah mereka sendiri.

Jabat tangan SSL menggunakan Kriptografi Kunci Umum & Simetris. Otentikasi Server terjadi secara default. Otentikasi Klien bersifat opsional dan tergantung apakah titik akhir Server dikonfigurasi untuk mengotentikasi klien atau tidak. Lihat posting blog saya karena saya telah menjelaskan ini secara rinci.

Akhirnya untuk pertanyaan ini

Bagaimana protokol HTTPS mengenali sertifikat? Mengapa HTTP tidak dapat berfungsi dengan sertifikat jika sertifikatlah yang melakukan semua pekerjaan kepercayaan / enkripsi / otentikasi?

Sertifikat hanyalah file yang formatnya ditentukan oleh standar X.509 . Ini adalah dokumen elektronik yang membuktikan identitas pihak yang berkomunikasi. HTTPS = HTTP + SSL adalah protokol yang mendefinisikan pedoman tentang bagaimana 2 pihak harus berkomunikasi satu sama lain.

INFORMASI LEBIH LANJUT

  • Untuk memahami sertifikat, Anda harus memahami apa itu sertifikat dan juga membaca tentang Manajemen Sertifikat. Ini penting.
  • Setelah ini dipahami, lanjutkan dengan jabat tangan TLS / SSL. Anda dapat merujuk RFC untuk ini. Tapi mereka kerangka yang mendefinisikan pedoman. Ada beberapa posting blog termasuk milik saya yang menjelaskan hal ini secara rinci.

Jika aktivitas di atas dilakukan, maka Anda akan memiliki pemahaman yang adil tentang Sertifikat dan SSL.

Kaushal Kumar Panday
sumber