Meluncurkan penyematan kunci publik dengan pelaporan HPKP

Menggunakan SSL di situs Anda adalah cara penting untuk menjaga keamanan dan privasi pengguna. Namun, mengaktifkan SSL bukanlah akhir dari cerita: ada banyak langkah yang dapat Anda lakukan untuk meningkatkan keamanan yang disediakan situs Anda lebih lanjut, mulai dari menetapkan atribut Secure pada cookie hingga mengaktifkan HTTP Strict Transport Security, menggunakan Content Security Policy, hingga mengunci hak istimewa situs Anda. Namun, men-deploy fitur canggih ini terkadang sulit. Untuk membantu Anda meluncurkan bentuk SSL yang lebih ketat, Chrome 46 dilengkapi dengan 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 adalah situs yang dimaksud. Saat browser Anda mengirim permintaan ke URL seperti https://developers.google.com, server akan menyediakan sertifikat SSL, dan jika sertifikat tersebut valid, browser akan mengizinkan permintaan untuk dilanjutkan dan menampilkan URL situs dengan gembok hijau di kolom URL.

Namun, apa yang dimaksud dengan sertifikat yang valid? Agar dianggap valid, sertifikat harus ditandatangani oleh certificate authority (CA), atau oleh sertifikat lain yang ditandatangani oleh CA (dikenal sebagai CA perantara). Browser dan sistem operasi dikirimkan dengan daftar beberapa ratus CA yang tepercaya untuk menerbitkan sertifikat. Namun, masalahnya adalah secara default, salah satu CA ini dapat menerbitkan sertifikat untuk situs mana pun. Jika salah satunya disusupi atau berperilaku tidak semestinya, hal itu dapat menjadi bencana bagi seluruh web.

Masukkan HTTP Public Key Pinning, atau HPKP. Standar ini memungkinkan situs mengirim header HTTP yang menginstruksikan browser untuk mengingat (atau "menyematkan") bagian dari rantai sertifikat SSL-nya. Browser kemudian 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 memutar 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 spesifikasinya atau postingan blog yang bagus dari sesama developer Chrome, Chris Palmer.

Haruskah saya mengaktifkan HPKP sekarang?

Belum tentu. Saat Anda men-deploy HPKP, Anda dapat dengan mudah melakukan kesalahan dan tidak sengaja melakukan DoS pada situs Anda. Jika Anda menyematkan situs ke satu kumpulan sertifikat, lalu harus men-deploy sertifikat 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 diterapkan dengan benar, HPKP saat ini sebagian besar digunakan oleh beberapa situs berprofil tinggi dan sensitif terhadap keamanan. Jika memutuskan untuk mengaktifkan HPKP, Anda harus memulai dengan nilai max-age yang sangat singkat dan meningkatkannya secara bertahap jika Anda tidak mengalami masalah.

Apa yang dimaksud dengan pelaporan HPKP dan bagaimana cara kerjanya?

Pelaporan HPKP, yang dikirimkan di Chrome 46, adalah fitur yang dapat Anda gunakan untuk mendeteksi konfigurasi yang salah 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 mengirimkan laporan ke report-uri jika tidak. Chrome tidak akan pernah memblokir permintaan berdasarkan pin di header Khusus Laporan, sehingga ini adalah cara yang aman untuk mencoba HPKP dan melihat apakah hal itu menyebabkan masalah bagi pengguna tanpa menjalankan risiko DoS terhadap situs Anda.

Perhatikan bahwa header Khusus Laporan hanya berlaku untuk permintaan tempat header tersebut diterima. Browser tidak mengingat pin Khusus Laporan seperti yang dilakukan untuk pin sebenarnya. Hal ini memungkinkan Anda menguji konfigurasi tanpa perlu meng-cache nilai buruk di browser pengguna, dan Anda dapat meluncurkan secara bertahap (misalnya, hanya pada satu resource) untuk menghindari server yang dibanjiri 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 yang ada 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 spesifikasi, tetapi saya akan menyoroti dua di antaranya di sini: served-certificate-chain dan validated-certificate-chain. served-certificate-chain adalah sertifikat persis seperti yang diterima Chrome saat menyiapkan koneksi SSL untuk permintaan. Di sisi lain, validated-certificate-chain adalah rantai yang dibangun ulang oleh Chrome saat mencoba memvalidasi sertifikat server, yang ternyata dapat berbeda dengan served-certificate-chain. Klien yang berbeda melakukan validasi sertifikat dengan cara yang berbeda, dan hal ini dapat menjadi penyebab umum kesalahan konfigurasi HPKP. Pastikan untuk memeriksa kolom ini jika Anda menerima laporan yang tidak terduga.

Satu "gotcha" 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 mungkin ingin mengirim laporan HPKP ke domain lain yang belum disematkan. 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.