Anda mungkin pernah mendengar tentang HTTPS dan bagaimana gembok hijau di browser Anda memberi kita ketenangan pikiran. Namun, dalam dunia pengembangan aplikasi, mempercayai begitu saja bahwa sertifikat itu valid tidak selalu cukup. Ada risiko laten di mana, bahkan dengan koneksi terenkripsi, seseorang dapat secara diam-diam mendengarkan apa yang terjadi antara perangkat Anda dan server.
Untuk mengatasi kerentanan keamanan ini, muncul teknik yang disebut Certificate Pinning . Pada dasarnya, teknik ini memberi tahu aplikasi kita: "Jangan mempercayai sembarang otoritas sertifikat; hanya terima koneksi jika server menyajikan sertifikat atau kunci publik yang persis sama." Ini seperti menempatkan penjaga gerbang yang sangat ketat di pintu komunikasi kita.
Apa sebenarnya SSL Pinning dan mengapa kita membutuhkannya?
Untuk memahami hal ini dengan benar, pertama-tama kita harus ingat bahwa HTTPS standar didasarkan pada rantai kepercayaan . Saat Anda terhubung ke server, server tersebut mengirimkan sertifikat digitalnya kepada Anda. Perangkat seluler Anda memeriksa apakah dokumen ini telah ditandatangani oleh Otoritas Sertifikasi (CA) yang dipercaya oleh sistem operasi. Jika tanda tangan valid dan sertifikat belum kedaluwarsa, koneksi akan terjalin.
Masalah muncul ketika penyerang berhasil menyusup ke koneksi di tengah jalan, yang dikenal sebagai serangan Man-in-the-Middle (MITM) . Jika peretas berhasil membuat Otoritas Sertifikasi (CA) menerbitkan sertifikat palsu namun valid, atau jika mereka berhasil menginstal sertifikat root berbahaya pada perangkat korban, sistem operasi akan menyetujui koneksi tersebut. Pada titik itu, penyerang dapat mencegat dan memodifikasi data sensitif, seperti detail bank atau kata sandi, tanpa pengguna menyadari sesuatu yang tidak biasa.
Di sinilah pinning berperan. Alih-alih mempercayai CA (Certificate Authority) yang diakui, aplikasi menyimpan salinan sertifikat server atau hash kunci publik. Selama proses jabat tangan (handshake), aplikasi membandingkan sertifikat yang diterima dengan sertifikat yang telah disimpannya. Jika keduanya tidak cocok bit demi bit, koneksi akan segera dihentikan, sehingga mencegah pemalsuan server.
Jenis-jenis penjangkaran: Sertifikat versus Kunci Publik
Tidak semua proses pinning dilakukan dengan cara yang sama. Tergantung pada apa yang kita putuskan untuk "di-pin", kita memiliki dua pendekatan utama. Yang pertama adalah Certificate Pinning , di mana kita menyimpan file sertifikat lengkap (.pem atau .der). Ini adalah opsi paling sederhana untuk diimplementasikan tetapi paling rumit untuk dipelihara, karena setiap kali sertifikat server kedaluwarsa dan diperbarui, kita harus memperbarui aplikasi di toko, atau pengguna akan kehilangan layanan.
Opsi kedua adalah Public Key Pinning . Dalam hal ini, kita hanya menyimpan hash (biasanya SHA-256) dari kunci publik sertifikat. Keuntungan utamanya adalah kunci publik dapat tetap utuh bahkan jika sertifikat diperbarui, yang memberi kita fleksibilitas sertifikat yang lebih besar dan mengurangi frekuensi pembaruan aplikasi yang dipaksakan. Selain itu, dengan hanya menyimpan hash, kode menjadi lebih bersih dan lebih sulit untuk diekstrak oleh seseorang yang mencoba melakukan rekayasa balik.
Implementasi teknis pada berbagai platform.
Jika kita bekerja dengan AndroidCara paling modern adalah dengan menggunakan file. network_security_config.xmlDalam file XML ini kita mendefinisikan domain dan hash dari sertifikat (pin) yang ingin kita otorisasi, sehingga memungkinkan kita untuk Aktifkan pengaturan keamanan penting di Android secara bawaan. Kemudian, kita cukup menautkan file ini di AndroidManifest.xmlDi masa lalu, hal-hal yang lebih kompleks dilakukan dengan menimpa kelas tersebut. DefaultHttpClient dan mengelola penyimpanan sertifikat Java melalui keytoolNamun, konfigurasi berbasis XML jauh lebih efisien.
Dalam ekosistem di iOSSituasinya sedikit berubah. Kita dapat memanfaatkan App Transport Security (ATS) dengan mengkonfigurasi file tersebut. Info.plist untuk mendefinisikan domain yang dijangkar. Namun, untuk kontrol penuh, biasanya validasi runtime diimplementasikan menggunakan URLSessionDelegateDalam metode tantangan autentikasi, kita mengekstrak sertifikat dari server dan membandingkannya dengan sertifikat tersimpan lokal dalam paket aplikasi.
Bagi yang menggunakan Kerangka kapasitor atau hibridaAda plugin seperti @capgo/capacitor-ssl-pinning yang menyatukan proses tersebut. Dalam kasus ini, konfigurasi biasanya dilakukan dalam file konfigurasi aplikasi, dengan menentukan daftar sertifikat dan mengaktifkan validasi. Sangat penting untuk menguji implementasi ini dengan alat seperti... Proksi Charles, mensimulasikan serangan MITM untuk memastikan bahwa aplikasi secara efektif menolak koneksi ketika sertifikat yang diberikan bukan sertifikat yang diharapkan.
Risiko, keterbatasan, dan pemeliharaan
Penggunaan PIN tidak selalu berjalan mulus. Bahaya terbesar adalah yang disebut penguncian karena kedaluwarsa . Jika sertifikat server kedaluwarsa dan Anda belum memperbarui aplikasi dengan PIN baru, semua pengguna Anda akan melihat kesalahan koneksi. Untuk menghindari bencana ini, praktik terbaik adalah menerapkan PIN cadangan . Kami menyimpan hash kunci publik sekunder yang hanya akan kami gunakan jika terjadi keadaan darurat atau rotasi yang tidak terduga.
Di sisi lain, pinning dapat menjadi masalah bagi pengembang yang perlu melakukan debugging pada komunikasi mereka. Agar alat pemantauan dapat berfungsi, terkadang perlu untuk menonaktifkan pinning di lingkungan pengembangan atau membuat versi debug khusus, selalu memastikan bahwa fungsi ini diaktifkan dalam versi produksi yang sampai ke pengguna akhir.
Terkait web, Chrome merupakan pelopor dalam mengimplementasikan konsep serupa. Chrome menggunakan HSTS (HTTP Strict Transport Security) untuk memberlakukan penggunaan HTTPS dan memelihara daftar situs yang "dimuat sebelumnya" untuk mencegah kerentanan kontak pertama. Meskipun standar HPKP memang ada untuk web, standar tersebut akhirnya tidak digunakan lagi karena terlalu berisiko dan dapat membuat situs web tidak dapat diakses jika terjadi kesalahan konfigurasi.
Penerapan certificate pinning merupakan keputusan strategis yang menyeimbangkan keamanan maksimal dengan operabilitas layanan. Dengan membatasi kepercayaan pada entitas tertentu, kami melindungi komunikasi dari serangan canggih, asalkan kami mempertahankan kontrol ketat atas siklus hidup kunci dan sertifikat kami untuk menghindari pelanggan kehilangan akses.
