Root CA Publisher
On this page
Root CA Publisher adalah service Python yang sangat kecil, yang membuat root certificate authority bisa dijangkau tanpa membuatnya bisa disentuh. Ia menyajikan dua file kepada siapa pun yang meminta — sertifikat root dan certificate revocation list-nya — dan tak lebih. Private key yang menandatangani keduanya tak pernah mendekatinya: sertifikat untuk intermediate authority dan setiap daftar pencabutan baru ditandatangani di host yang tak terhubung ke jaringan apa pun, dan hanya hasil yang sudah ditandatangani yang dibawa ke publisher.
Saya membangunnya karena root CA punya dua kebutuhan yang saling tarik. Setiap validator di dunia harus bisa mengambil daftar pencabutannya di alamat yang tertulis di sertifikat-sertifikat di bawahnya, kapan pun; dan key-nya harus mustahil dicuri, yang berarti ia tak boleh tinggal di mesin yang bisa dijangkau internet. Memecah root menjadi penanda tangan offline dan publisher online memenuhi keduanya, dan publisher-nya cukup kecil untuk dipercaya dalam sekali lihat.
Sekilas
| Bahasa & framework | Python, dengan Flask |
|---|---|
| Arsitektur | Transaction Script Service |
| Versi | 2.11.2 |
| Status | Stabil, berjalan di production |
| Bentuk | Service HTTP yang hanya menerbitkan, dikirim sebagai satu executable, bisa dipakai ulang project mana pun yang punya certificate authority sendiri |
| Kode sumber | Privat |
Yang dikerjakannya
A. Menerbitkan sertifikat root
Sertifikat root disajikan dalam DER di alamat akar, yang memang ditunjuk sertifikat intermediate authority ketika memberi tahu validator di mana issuer-nya bisa ditemukan.
B. Menerbitkan daftar pencabutan
Certificate revocation list milik root disajikan di alamat yang tertulis di setiap sertifikat intermediate sebagai CRL distribution point-nya. Validator yang memeriksa tanda tangan menelusuri rantai ke atas, sampai di intermediate, lalu bertanya ke service ini apakah root sudah mencabutnya.
C. Menerima daftar pencabutan baru tanpa rilis baru
Daftar pencabutan dibaca dari file yang di-mount ke container. Ketika host offline menandatangani daftar baru, file itu diganti dan request berikutnya langsung menyajikannya — tanpa rebuild, tanpa restart, tanpa mengubah service.
D. Melaporkan bahwa ia hidup
Endpoint health yang minimal membuat platform container, dan service yang bergantung pada root, bisa melihat bahwa publisher sedang berjalan.
Antarmuka
| Kemampuan | Kegunaan |
|---|---|
| Sertifikat root | dalam DER, sebagai application/pkix-cert |
| Daftar pencabutan | daftar pencabutan root dalam DER, sebagai application/pkix-crl |
| Liveness | untuk platform container |
Validator, atau operator yang memeriksa kapan daftar itu harus diganti berikutnya, membacanya dengan tool standar, di sini terhadap host contoh:
Standar
| Standar | Yang dijaminnya di sini |
|---|---|
| X.509 dan RFC 5280 | sertifikat root dan daftar pencabutan yang bisa dibaca validator mana pun |
| CRL Distribution Points dan Authority Information Access | alamat yang tertulis di tiap sertifikat intermediate langsung menuju service ini |
| RFC 2585 | media type yang diharapkan validator untuk sertifikat dan daftar pencabutan yang disajikan lewat HTTP |
| Encoding DER | bentuk biner yang diambil validator, byte demi byte persis seperti yang ditandatangani host offline |
Di dalamnya
Service ini adalah Transaction Script Service dalam bentuknya yang paling kecil: satu file Flask yang tiap endpoint-nya prosedur pendek — baca file, bungkus dengan respons yang tepat — dan satu module helper yang tahu bagaimana sertifikat dan daftar pencabutan harus disajikan. Ia dibundel menjadi satu executable bersama sertifikat root, jadi container-nya tak membawa source code.
Keputusan rancangan
Key root tinggal offline, dan publisher tak bisa menandatangani apa pun. Key root authority adalah satu-satunya rahasia yang, bila dicuri, membuat penyerang bisa mencetak kepercayaan untuk semua yang ada di bawahnya, dan satu-satunya cara yang bisa diandalkan untuk menjauhkan key dari internet adalah menyimpannya di mesin yang tak pernah terhubung. Karena itu root dipecah dua. Membuat intermediate authority, mencabutnya, dan menghasilkan daftar pencabutan baru semuanya terjadi di host offline; publisher tak memegang key, tak punya endpoint yang menulis, dan tak bisa dibujuk menandatangani. Membobolnya paling jauh membuat orang bisa menyajikan daftar yang basi, tapi tak pernah daftar palsu, karena validator memeriksa tanda tangan yang dibuat host offline.
Sertifikat adalah bagian dari build; daftar pencabutan bukan. Sertifikat root berubah sekali dalam dua dekade, jadi ia dibundel ke dalam executable dan tak bisa menyimpang dari image yang menyajikannya. Daftar pencabutan berubah menurut jadwal, jadi ia berupa file yang di-mount: menggantinya adalah tugas operasional yang dikerjakan tanpa menyentuh service, dan hasil host offline diterbitkan persis seperti saat ditandatangani.
Daftar pencabutan bertenggat menentukan ritme upacara offline. Tiap daftar yang ditandatangani host offline berlaku sembilan puluh hari. Validator yang mendapati daftar melewati tanggal next-update-nya menganggap seluruh rantai di bawah root tak bisa diverifikasi, jadi mengganti daftar jauh sebelum tanggal itu adalah kewajiban rutin, bukan langkah darurat. Sembilan puluh hari berarti host offline hanya dibutuhkan beberapa kali setahun, sementara pencabutan tetap sampai ke setiap validator dalam waktu yang terbatas.
Disajikan persis seperti yang diharapkan validator, lewat HTTP biasa. Sertifikat dan daftar pencabutan disajikan dalam DER dengan media type yang memang ditetapkan untuknya, panjang yang eksplisit, dan header yang mencegah browser menebak tipe lain. Alamat yang ditulis di sertifikat memakai HTTP biasa, sama seperti untuk authority di bawah root ini: memeriksa pencabutan lewat TLS berarti lebih dulu memeriksa pencabutan sertifikat TLS-nya, lingkaran yang dihindari validator, dan file-filenya sudah ditandatangani, jadi jalur pengirimannya tak perlu menjaminnya.
Cukup kecil untuk dipakai ulang di mana pun CA dibutuhkan. Tak ada bagian service ini yang khusus untuk satu project: ia menyajikan sertifikat root apa pun yang dibundel saat build dan daftar pencabutan apa pun yang diberikan kepadanya. Publisher yang sama cocok untuk hirarki penandatanganan dokumen hari ini dan certificate authority milik VPN besok, dengan root dan alamatnya sebagai satu-satunya yang berubah.
Spesifikasi
| Masukan | Sertifikat root, dibundel saat build; daftar pencabutan, sebagai file DER yang di-mount dan diganti operator |
|---|---|
| Hasil | Sertifikat root dan daftar pencabutan dalam DER, dengan media type RFC 2585 |
| Penandatanganan | Tidak ada: key root dan seluruh penandatanganan tetap di host offline |
| Hirarki yang dilayani | Root yang berlaku dua puluh tahun dan menerbitkan intermediate authority, masing-masing dibatasi hanya menerbitkan sertifikat akhir; tanda tangan SHA-256 |
| Umur daftar pencabutan | Sembilan puluh hari per daftar, diganti sebelum kedaluwarsa |
| Berjalan sebagai | Satu executable di image container multi-stage, dengan daftar pencabutan di-mount dari volume |
Terkait
Intermediate authority untuk sertifikat penanda tangan, diterbitkan root ini dan diperiksa terhadap daftar pencabutannya.
Intermediate authority untuk stempel waktu, di bawah root yang sama.
Signer yang mengambil daftar pencabutan ini sebelum setiap tanda tangan, supaya bukti yang tertanam di tiap PDF lengkap.
Istilah
- Root certificate authority
- Authority di puncak hirarki sertifikat, yang sertifikatnya dipercaya langsung oleh validator dan yang menandatangani authority di bawahnya.
- Offline root
- Root authority yang private key-nya disimpan di mesin yang tak pernah terhubung ke jaringan, dipakai hanya saat ada yang harus ditandatangani.
- Certificate revocation list
- Daftar bertanda tangan berisi sertifikat yang telah dicabut authority, berlaku sampai waktu next-update yang tertera.
- CRL distribution point
- Alamat yang tertulis di sertifikat, tempat validator mengambil daftar pencabutan dari authority yang menerbitkannya.
- DER
- Encoding biner tempat sertifikat dan daftar pencabutan ditandatangani dan dipertukarkan.
Technologies covered
- Python
- Flask
- X.509