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:
- Enkripsi data lapisan aplikasi Anda. (Dalam kasus Anda, protokol lapisan aplikasi adalah HTTP.)
- Otentikasi server ke klien.
- 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 .