Timestamp Authority
On this page
- Sekilas
- Yang dikerjakannya
- A. Membubuhkan waktu pada sidik jari dokumen
- B. Menerbitkan dan memperbarui sertifikat penanda tangannya sendiri
- C. Membiarkan siapa pun memeriksa sertifikatnya
- D. Menyimpan catatan setiap token
- E. Mengatur administrasi
- Antarmuka
- Standar
- Di dalamnya
- Keputusan rancangan
- Spesifikasi
- Terkait
- Istilah
Timestamp Authority adalah service Rust yang menjawab satu request dengan satu pernyataan bertanda tangan: sidik jari persis dari dokumen ini sudah ada pada detik ini. Ia mengimplementasikan time-stamping RFC 3161 untuk PDF bertanda tangan, dan sekaligus menjadi certificate authority kecil bagi dirinya sendiri — ia menerbitkan, menyimpan, dan memperbarui sertifikat yang dipakainya untuk menandatangani, menerbitkan informasi pencabutan untuk sertifikat itu, dan mencatat setiap token yang pernah dihasilkannya.
Saya membangunnya karena tanda tangan digital hanya membuktikan siapa yang menandatangani, bukan kapan. Sertifikat penanda tangan kedaluwarsa setelah beberapa tahun dan bisa dicabut besok, dan tanpa bukti terpercaya tentang waktu penandatanganan, pembaca tak bisa tahu apakah tanda tangan dibuat selagi sertifikatnya masih baik. Stempel waktu dari otoritas yang independen, tertanam di dalam PDF, adalah bukti itu, dan ia menjaga tanda tangan tetap bisa diverifikasi lama setelah sertifikat di belakangnya habis.
Sekilas
| Bahasa & framework | Rust, dengan actix-web, sqlx di atas PostgreSQL, dan mesin time-stamping OpenSSL lewat interface C-nya |
|---|---|
| Arsitektur | Flat Layered |
| Versi | 2.11.2 |
| Status | Stabil, berjalan di production |
| Bentuk | Service HTTP mandiri: endpoint time-stamping dan pencabutan yang publik, serta API terautentikasi untuk administrasi |
| Kode sumber | Privat |
Yang dikerjakannya
A. Membubuhkan waktu pada sidik jari dokumen
Aplikasi penanda tangan mengirim time-stamp request yang hanya membawa hash dokumen, tak pernah dokumennya. Service menjawab dengan token bertanda tangan yang mengikat hash itu dengan waktu saat ini, nomor serial yang unik, dan nonce client, lalu aplikasi menanamkan token itu di PDF di samping tanda tangannya.
B. Menerbitkan dan memperbarui sertifikat penanda tangannya sendiri
Sertifikat yang menandatangani setiap token dibuat oleh service itu sendiri, di bawah intermediate CA miliknya, pada start pertama. Ketika masa berlakunya hampir habis, request berikutnya memperbaruinya sebelum menandatangani. Service tak pernah menstempel dengan sertifikat kedaluwarsa, dan tak ada orang yang harus ingat menggantinya.
C. Membiarkan siapa pun memeriksa sertifikatnya
Validator yang membaca stempel waktu bertahun-tahun kemudian harus bisa memercayai sertifikat yang menandatanganinya. Service menerbitkan sertifikat intermediate CA-nya, certificate revocation list, dan OCSP responder, semuanya tanpa autentikasi, di alamat yang tertulis di sertifikatnya.
D. Menyimpan catatan setiap token
Setiap respons disimpan beserta waktunya, policy, algoritma hash, sidik jari dokumen, nonce, dan nomor serial sertifikat penanda tangannya. Token mana pun yang pernah diterbitkan service bisa ditelusuri kembali ke request yang menghasilkannya.
E. Mengatur administrasi
Time-stamping dan pemeriksaan pencabutan bersifat publik; mencabut sertifikat serta mengelola user, role, dan access token mewajibkan token bertanda tangan dengan role yang sesuai.
Antarmuka
| Kemampuan | Akses |
|---|---|
| Menstempel waktu satu hash: request RFC 3161 masuk, respons bertanda tangan keluar | publik |
| Sertifikat intermediate CA dalam DER, di alamat yang ditunjuk sertifikat | publik |
| Certificate revocation list | publik |
| OCSP, lewat GET dan POST | publik |
| Readiness, mencakup database dan root CA | publik |
| Mencabut sertifikat dengan alasan RFC 5280 | token |
| Login; mengelola user, role, password, dan access token | token, menurut role |
Client RFC 3161 mana pun bisa memakainya. Begini perjalanan pulang-pergi dengan OpenSSL, terhadap host contoh:
Standar
| Standar | Yang dijaminnya di sini |
|---|---|
| RFC 3161, Time-Stamp Protocol | request dan token yang sudah dipahami penanda tangan dan validator PDF |
| CMS SignedData (RFC 5652) | token yang ditandatangani dalam format amplop yang sama dengan tanda tangan yang dilindunginya |
| X.509 v3 dan RFC 5280 | sertifikat penanda tangan yang dibatasi untuk time-stamping, dan daftar pencabutan yang bisa dibaca validator mana pun |
| RFC 6960, OCSP | jawaban pencabutan untuk sertifikat penanda tangan, lewat GET atau POST |
| Authority Information Access dan CRL Distribution Points | sertifikat yang memberi tahu validator di mana issuer dan status pencabutannya bisa ditemukan |
| JSON Web Token dengan RS256 | access token untuk administrasi, ditandatangani key yang bisa dirotasi service |
| W3C Trace Context dan OpenTelemetry | trace, log, dan metrics yang menyambung trace pemanggil |
Di dalamnya
Service ini mengikuti bentuk Flat Layered yang sama dengan certificate authority tempat ia bercabang: route, controller, service, repository, dan helper berjajar satu tingkat, dengan satu file per operasi — menjawab time-stamp request, membuat sertifikat penanda tangan, menjawab OCSP, membangun daftar pencabutan. Keduanya berbagi kode sampai titik percabangan; mesin time-stamping, siklus hidup penanda tangan, dan catatan token dibangun sesudahnya, dan perbaikan yang dibuat belakangan di salah satunya sengaja dibawa ke yang lain.
Keputusan rancangan
Kriptografinya milik OpenSSL; yang milik saya hanya keputusannya. Time-stamping punya banyak field yang harus tepat persis, dan OpenSSL sudah punya mesin time-stamp response yang menghasilkannya. Jadi saya menjalankan mesin itu lewat binding yang dibuat hanya untuk daftar fungsi yang sempit, tidak menyusun strukturnya dengan tangan. Dua nilai tak diserahkan ke OpenSSL. Nomor serial tiap token berasal dari sequence database tersendiri, terpisah dari nomor serial sertifikat, dan diberikan ke mesin lewat callback. Waktu dibaca sekali per request dari jam host, yang dijaga sinkron dengan NTP, dan diberikan dengan cara yang sama, sehingga waktu di token dan waktu di catatan adalah detik yang sama.
Token harus bisa dibaca tool yang akan memeriksanya. Pada versi pertama, library Python penanda tangan PDF yang banyak dipakai menerima respons yang berisi status tapi tanpa token di dalamnya. Penyebabnya ada pada cara request sampai ke OpenSSL — mesin diberi request asli, bukan request yang sudah disesuaikan — dan perbaikannya mengubah empat bagian sekaligus: request di-encode ulang sebelum diteruskan, sertifikat penanda tangan selalu disertakan di respons — juga bila request tak memintanya — digest yang dipakai sesuai panjang sidik jari kiriman client, dan respons yang tak akan membawa token langsung gagal, tak dikembalikan seolah-olah jawaban.
Rantai berhenti di bawah root. Tiap token membawa sertifikat penanda tangan dan intermediate CA, supaya validator bisa menyusun jalurnya, tapi tidak root: root adalah trust anchor yang harus sudah dipegang validator, dan menyertakannya hanya membuat setiap token lebih besar. Satu versi awal pernah menyertakannya; saya mencabutnya lagi.
Sertifikat penanda tangan dibuat di dalam, tak pernah diminta dari luar. Satu-satunya sertifikat yang dipakai service ini untuk menandatangani token adalah sertifikat yang dibuatnya sendiri. Profilnya dikunci di kode, bukan di konfigurasi — bukan CA, key usage critical dan terbatas pada digital signature dan non-repudiation, extended key usage critical dan terbatas pada time-stamping — karena dua insiden menunjukkan akibat profil yang dibiarkan longgar: satu sertifikat terbit tanpa tujuan time-stamping, dan satu angkatan awal terbit sebagai versi 1 padahal membawa ekstensi versi 3. Service membuat sertifikat itu pada start pertama, menolak start bila gagal, dan memperbaruinya di dalam jalur request sebelum masa berlakunya sempat habis.
Setiap token meninggalkan bukti, dan bukti itu tak menyimpan dokumen. Service tak pernah menerima dokumen, hanya hash-nya, jadi ia bisa mencatat dan menyimpan sidik jari secara utuh tanpa memegang apa pun yang rahasia. Tiap respons disimpan bersama waktu, policy, algoritma, sidik jari, nonce, sertifikat penanda tangan, dan request id, dan tiap request memancarkan atribut telemetry untuk non-repudiation — siapa yang meminta, dari mana, dan apa yang distempel — dengan rantai mentah alamat forwarding disimpan hanya sebagai bukti. Respons dikirim dengan no-store, karena stempel waktu yang di-cache adalah stempel waktu yang salah.
Pencabutan sertifikat penanda tangan bekerja sama seperti di certificate authority. OCSP responder punya signer sendiri, memantulkan nonce, menyertakan intermediate CA, dan sedikit memundurkan awal tiap jawaban untuk client yang jamnya terlambat; daftar pencabutan berversi 2, dibangun lewat interface C OpenSSL. Alamat di setiap sertifikat memakai HTTP biasa, karena memeriksa pencabutan lewat TLS berarti lebih dulu memeriksa sertifikat TLS-nya, dan sertifikat responder menunjuk issuer-nya, tak pernah dirinya sendiri.
Kepercayaan berawal dari root, dan operasinya mengikuti pelajaran certificate authority. Intermediate CA diverifikasi terhadap root setiap kali start. Administrasi memakai token bertanda tangan dengan key identifier dan id token yang bisa dicabut; telemetry lewat OpenTelemetry dengan metrics delta; readiness mewajibkan database dan root CA sekaligus; dan migration ikut di dalam image, karena menjalankannya hanya pada database kosong pernah membuat perubahan skema berikutnya tak sampai ke staging maupun production.
Spesifikasi
| Masukan | Time-stamp request RFC 3161 yang membawa hash dokumen dan nonce opsional; pertanyaan OCSP dan unduhan daftar dari validator mana pun |
|---|---|
| Hasil | Time-stamp response bertanda tangan, jawaban OCSP, daftar pencabutan versi 2, dan sertifikat intermediate CA |
| Waktu | Jam host yang disinkronkan NTP, dibaca sekali per request; akurasi satu detik |
| Key | RSA 4096 untuk sertifikat penanda tangan dan responder |
| Penyimpanan | PostgreSQL, memegang setiap token dan sertifikat yang diterbitkan, dengan migration yang dikirim di dalam image |
| Diverifikasi dengan | Tool time-stamp milik OpenSSL dan library penanda tangan PDF yang menanamkan tokennya |
| Berjalan sebagai | Image container, sebagai user non-root, dengan konfigurasi di-mount dari volume |
Terkait
Certificate authority tempat service ini bercabang, yang berbagi desain pencabutan dan aksesnya.
Toolkit yang menjalankan migration service ini saat satu rilis sampai ke production.
Ke mana atribut audit, trace, dan metrics service ini pergi setelah meninggalkannya.
Istilah
- Timestamp authority
- Service terpercaya yang menandatangani pernyataan bahwa data tertentu sudah ada pada waktu tertentu.
- Message imprint
- Hash dokumen yang dibawa time-stamp request sebagai pengganti dokumennya.
- Nonce
- Angka acak yang ditaruh client di request dan diharapkan kembali di jawaban, supaya jawaban lama tak bisa diputar ulang.
- Intermediate CA
- Certificate authority yang sertifikatnya ditandatangani root, dan yang menandatangani sertifikat yang melakukan pekerjaan sebenarnya.
- OCSP
- Online Certificate Status Protocol: client menanyakan apakah satu sertifikat masih sah dan menerima jawaban bertanda tangan.
- Trust anchor
- Sertifikat root yang sudah dipercaya validator, tempat setiap rantai yang diperiksanya harus berakhir.
Technologies covered
- Rust
- PostgreSQL
- OpenTelemetry
- OCSP
- X.509