Skip to content

Root CA Publisher

By Romi Fadli, S.Kom. 7 min read Security & Secrets
On this page
A locked offline host holding the root key, a signed revocation list crossing an air gap to a small publisher server, which serves the root certificate and the list to a validator

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 & frameworkPython, dengan Flask
ArsitekturTransaction Script Service
Versi2.11.2
StatusStabil, berjalan di production
BentukService HTTP yang hanya menerbitkan, dikirim sebagai satu executable, bisa dipakai ulang project mana pun yang punya certificate authority sendiri
Kode sumberPrivat
Apa module ini dan bagaimana keadaannya.

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

KemampuanKegunaan
Sertifikat rootdalam DER, sebagai application/pkix-cert
Daftar pencabutandaftar pencabutan root dalam DER, sebagai application/pkix-crl
Livenessuntuk platform container
Seluruh antarmukanya: dua file dan satu health check, semuanya publik.

Validator, atau operator yang memeriksa kapan daftar itu harus diganti berikutnya, membacanya dengan tool standar, di sini terhadap host contoh:

bash
curl -s http://ca.example.org/crl -o root.crl
openssl crl -inform DER -in root.crl -noout -lastupdate -nextupdate

Standar

StandarYang dijaminnya di sini
X.509 dan RFC 5280sertifikat root dan daftar pencabutan yang bisa dibaca validator mana pun
CRL Distribution Points dan Authority Information Accessalamat yang tertulis di tiap sertifikat intermediate langsung menuju service ini
RFC 2585media type yang diharapkan validator untuk sertifikat dan daftar pencabutan yang disajikan lewat HTTP
Encoding DERbentuk biner yang diambil validator, byte demi byte persis seperti yang ditandatangani host offline
Standar yang dipatuhi service, dan yang dijamin masing-masing.

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

MasukanSertifikat root, dibundel saat build; daftar pencabutan, sebagai file DER yang di-mount dan diganti operator
HasilSertifikat root dan daftar pencabutan dalam DER, dengan media type RFC 2585
PenandatangananTidak ada: key root dan seluruh penandatanganan tetap di host offline
Hirarki yang dilayaniRoot yang berlaku dua puluh tahun dan menerbitkan intermediate authority, masing-masing dibatasi hanya menerbitkan sertifikat akhir; tanda tangan SHA-256
Umur daftar pencabutanSembilan puluh hari per daftar, diganti sebelum kedaluwarsa
Berjalan sebagaiSatu executable di image container multi-stage, dengan daftar pencabutan di-mount dari volume
Yang diterima, dikembalikan, dan dibutuhkan service.

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

About the author

Photo of Romi Fadli

Romi Fadli, S.Kom.

Solution Architect · Backend Engineer · Embedded Systems

In my day job I work as a solution architect. I design the system, lead the team that builds it — quality assurance, backend developers, a UI developer, DevOps and DevSecOps — and write the most critical modules myself, such as a certificate authority, a long-term PDF signer, and the core API of a personnel system.

I work across the whole stack that a running system actually needs. On the hardware side that means PCB design, microcontrollers, and embedded firmware — including RISC-V boards running FreeRTOS and Embassy, speaking MQTT over mutually authenticated TLS on a microcontroller with 64 KB of SRAM.

Most of my day-to-day work is software: Rust backends and API modules built on Clean Architecture, an OAuth2/OpenID Connect authorization server written from scratch, PAdES document signing, and certificate authorities — root CAs, timestamping authorities, and OCSP responders. I also build the frontends that sit on top of them.

Running all of that means infrastructure: Docker Compose stacks, networking, Mikrotik and RADIUS, observability with OpenTelemetry, and a steady habit of writing command-line tools and utilities for Linux when the existing ones do not fit.

Share

Enjoyed this?

Get an email when a new article is published.

Referenced by

A central core holding people, organisations, documents, and certificates, connected to eight surrounding services for storage, addresses, certificates, timestamps, the root, signing, thumbnails, and face challenges

Inti Laravel dari platform penandatanganan dokumen: memegang user, identitas, organisasi, sistem client, dokumen beserta versi bertanda tangannya, stempel, dan sertifikat, serta mengorkestrasi service yang menandatangani, menstempel waktu, merender, dan menyimpan — tanpa pernah memegang file.

9 min read Read more →
A purple root circle linked to a blue and an orange intermediate circle, which lead to a signed document with a green seal and to a clock.

Aurograf

DevOps

Platform tanda tangan digital Pemerintah Kota Tangerang Selatan: penanda tangan membuktikan identitasnya, menandatangani PDF hingga PAdES B-LTA dengan sertifikat dari otoritas milik platform sendiri, dan siapa pun bisa memverifikasinya — versi 2, yang saya rancang, bangun, dan operasikan.

10 min read Read more →