Meluncurkan penyematan kunci publik dengan pelaporan HPKP

Emily Stark

Menggunakan SSL di situs Anda adalah cara yang penting untuk menjaga keamanan dan privasi bagi pengguna. Namun, mengaktifkan SSL bukanlah akhir dari ceritanya: ada banyak langkah yang dapat Anda lakukan untuk lebih meningkatkan keamanan yang disediakan situs Anda, mulai dari menyetel Atribut Aman pada cookie Anda, mengaktifkan HTTP Strict Transport Security hingga menggunakan Kebijakan Keamanan Konten untuk mengunci hak istimewa situs Anda. Namun, menerapkan fitur canggih ini terkadang bisa merepotkan. Untuk membantu Anda meluncurkan bentuk SSL yang lebih ketat, Chrome 46 menghadirkan fitur yang disebut pelaporan HPKP.

Apa arti semua akronim ini?

Keamanan di web saat ini mengandalkan sertifikat SSL: tanda tangan kriptografis yang membuktikan bahwa situs memang benar milik pengguna. Saat browser mengirim permintaan ke URL seperti https://developers.google.com, server menyediakan sertifikat SSL, dan jika sertifikat valid, browser mengizinkan permintaan untuk dilanjutkan dan menampilkan URL situs dengan gembok hijau di kolom URL.

Bagaimanapun, apa itu sertifikat yang valid? Agar dianggap valid, sertifikat harus ditandatangani oleh certificate authority (CA), atau sertifikat lain yang ditandatangani oleh CA (dikenal sebagai intermediate CA). Browser dan sistem operasi dilengkapi dengan daftar ratusan CA yang dipercaya untuk menerbitkan sertifikat. Namun, masalahnya adalah secara default, semua CA ini dapat menerbitkan sertifikat untuk situs mana pun. Jika salah satunya disusupi atau berperilaku tidak baik, hal tersebut dapat merusak seluruh web.

Masukkan HTTP Public Key Pinning, atau HPKP. Standar ini memungkinkan situs mengirim header HTTP yang memerintahkan browser untuk mengingat (atau "pin") bagian dari rantai sertifikat SSL-nya. Kemudian browser akan menolak koneksi berikutnya yang tidak cocok dengan pin yang sebelumnya diterima. Berikut adalah contoh header HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

Header ini menentukan dua hash sertifikat sebagai pin. Salah satunya adalah hash sertifikat dalam rantai sertifikat situs, dan yang lainnya adalah pin cadangan, atau hash sertifikat yang dapat digunakan situs jika perlu merotasi sertifikatnya. Header juga menyertakan nilai max-age. Setelah jumlah detik tersebut berlalu, browser akan melupakan pin.

Untuk mengetahui informasi selengkapnya tentang HPKP secara umum, lihat spesifikasi atau postingan blog yang bagus dari sesama developer Chrome, Chris Palmer.

Haruskah aku mengaktifkan HPKP sekarang?

Belum tentu. Saat menerapkan HPKP, sangat mudah untuk melakukan kesalahan dan tidak sengaja melakukan DoS pada situs Anda. Jika Anda menyematkan situs ke satu kumpulan sertifikat, lalu harus menerapkan yang baru, pengguna yang telah melihat pin tidak akan dapat mengakses situs Anda hingga masa berlaku pin berakhir (berdasarkan nilai max-age di header).

Karena sulit untuk melakukannya dengan benar, HPKP sebagian besar digunakan oleh beberapa situs profil tinggi yang sensitif terhadap keamanan. Jika memutuskan untuk mengaktifkan HPKP, Anda harus memulai dengan nilai usia maksimum yang sangat singkat lalu meningkatkannya secara bertahap jika tidak mengalami masalah.

Apa yang dimaksud dengan pelaporan HPKP dan apa manfaatnya?

Pelaporan HPKP, yang dikirimkan di Chrome 46, adalah fitur yang dapat digunakan untuk mendeteksi kesalahan konfigurasi saat meluncurkan HPKP.

Pertama, Anda dapat memulai dengan mengirimkan header Public-Key-Pins-Report-Only, bukan header Public-Key-Pins:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Saat situs Anda mengirimkan header tersebut, Chrome akan memverifikasi apakah koneksi saat ini cocok dengan pin, dan mengirim laporan ke report-uri jika tidak. Chrome tidak akan pernah memblokir permintaan berdasarkan pin pada header Hanya Laporan, jadi ini adalah cara yang aman untuk mencoba HPKP dan melihat apakah itu menyebabkan masalah bagi pengguna Anda tanpa menjalankan risiko DoSing situs Anda.

Perhatikan bahwa header Hanya Laporan hanya berlaku untuk permintaan tempat header diterima. Browser tidak mengingat pin Khusus Laporan seperti halnya untuk pin sebenarnya. Dengan demikian, Anda dapat menguji konfigurasi tanpa perlu khawatir men-cache nilai buruk di browser pengguna, dan dapat meluncurkannya secara bertahap (misalnya, hanya di satu resource) untuk menghindari membanjiri server Anda dengan laporan.

Saat meluncurkan header Public-Key-Pins yang sebenarnya untuk mulai menerapkan pin, Anda juga dapat menyertakan nilai report-uri di header tersebut, sehingga Anda akan terus mendapatkan laporan jika terjadi masalah.

Apa saja yang tercantum dalam laporan pelanggaran HPKP?

Laporan pelanggaran HPKP adalah pesan JSON yang dikirim dalam permintaan POST HTTP ke report-uri yang dikonfigurasi. Daftar kolom dapat ditemukan di spec, tetapi saya akan menyoroti dua di antaranya di sini: served-certificate-chain dan validated-certificate-chain. served-certificate-chain adalah sertifikat yang sama persis dengan yang diterima Chrome saat menyiapkan koneksi SSL untuk permintaan. Di sisi lain, validated-certificate-chain adalah rantai yang dibuat ulang oleh Chrome saat mencoba memvalidasi sertifikat server, yang secara mengejutkan dapat berbeda dengan served-certificate-chain. Klien yang berbeda melakukan validasi sertifikat dengan cara yang berbeda pula, dan hal ini dapat menjadi penyebab umum kesalahan konfigurasi HPKP. Pastikan untuk memeriksa kolom ini jika Anda menerima laporan yang tidak diharapkan.

"Dapatkan" terakhir

Jika Anda men-deploy pelaporan HPKP, ingat bahwa Chrome melakukan validasi pin untuk semua permintaan—termasuk permintaan pengiriman laporan. Jadi, jika telah men-deploy HPKP untuk situs Anda, sebaiknya kirim laporan HPKP ke domain lain yang belum Anda sematkan. Jika tidak, pelanggaran PIN di situs Anda akan memicu laporan ke domain yang sama, yang juga akan gagal dalam pelanggaran PIN, sehingga Anda tidak akan menerima laporan.

Jika tidak memiliki domain lain, Anda dapat mencoba layanan seperti report-uri.io, yang menangani laporan pelanggaran untuk Anda.