Untuk membuat tanda tangan PDF tetap terverifikasi bertahun-tahun dari sekarang, setelah sertifikat penandatanganan kedaluwarsa dan CA-nya berotasi, PDFium Component dapat menghasilkan tanda tangan PAdES jangka panjang di Windows: stempel waktu RFC 3161 untuk waktu tepercaya, Document Security Store yang menyematkan materi validasi, dan DocTimeStamp arsip atas seluruh berkas. Tiga tambahan tersebut adalah tingkat dasar PAdES B-T, B-LT, dan B-LTA, dan PDFium Component mencapai semuanya dari satu panggilan penandatanganan. Ini adalah kemampuan khusus Windows, yang dibatasi oleh PadesCryptoAvailable
Artikel ini adalah yang ketiga dari seri ini. Yang pertama, menandatangani PDF dengan PAdES B-B menggunakan PDFium VCL, membahas tanda tangan dasar; yang kedua, memeriksa tanda tangan digital PDF dan tingkat PAdES, membahas pembacaan kembali tanda tangan dan mengetahui tingkat mana yang dicapai. Di sini perhatian difokuskan pada arsip: tanda tangan yang harus bertahan setelah sertifikat kedaluwarsa dan tetap dapat diverifikasi untuk masa retensi yang diukur dalam hitungan tahun, bukan minggu
Mengapa tanda tangan PDF yang valid berhenti diverifikasi seiring waktu?
Tanda tangan dasar hanya menjawab satu pertanyaan: apakah byte ini diubah setelah penandatanganan. Tanda tangan tersebut, dengan sendirinya, tidak membuktikan kapan penandatanganan terjadi, dan celah itulah yang merusaknya nanti. Struktur CMS membawa atribut waktu penandatanganan (signing-time), tetapi penandatangan menulis nilai tersebut dari jam mereka sendiri, sehingga validator tidak memiliki alasan untuk mempercayainya. Ketika sertifikat penandatanganan kemudian kedaluwarsa atau CA mencabutnya, validator yang ketat tidak dapat lagi membedakan tanda tangan yang dibuat saat sertifikat masih valid dari tanda tangan yang dipalsukan setelah sertifikat tersebut habis masa berlakunya. Tanda tangan tersebut baik-baik saja pada hari pembuatannya dan menjadi tidak dapat diverifikasi bukan karena kesalahannya sendiri
Apa itu tanda tangan PDF LTV atau stempel waktu arsip?
PAdES mendefinisikan empat tingkat dasar yang saling membangun satu sama lain, dan PDFium Component mengeksposnya melalui enumerasi TPadesLevel (plB_B, plB_T, plB_LT, plB_LTA). B-B is the plain signature. B-T menambahkan stempel waktu tepercaya di atas nilai tanda tangan. B-LT (jangka panjang) menambahkan materi validasi tertanam, properti yang dimaksud kebanyakan orang dengan "LTV". B-LTA (jangka panjang dengan stempel waktu arsip) membungkus semuanya dalam satu stempel waktu lagi yang mencakup seluruh berkas, sehingga materi yang disematkan itu sendiri terbukti utuh sejak saat pengarsipan
Pembacaan praktisnya adalah seperti tangga. B-T membuktikan kapan. B-LT membuktikan dengan apa tanda tangan tersebut masih dapat diperiksa. B-LTA membuktikan bahwa seluruh paket belum dirusak sejak disegel, dan ini adalah tingkat yang Anda perbarui, dengan menambahkan DocTimeStamp baru sebelum yang sebelumnya kedaluwarsa, untuk memperpanjang arsip tanpa batas. Untuk kontrak atau catatan kepatuhan dengan kewajiban retensi jangka panjang, B-LTA adalah targetnya; B-LT adalah batas minimum yang pragmatis
Menambahkan waktu tepercaya: PAdES B-T dengan RFC 3161
PDFium Component mengubah tanda tangan B-B menjadi B-T dengan menyetel dua bidang pada TPadesSignOptions: naikkan Level menjadi plB_T dan sertakan TsaUrl. Ketika keduanya ada, pipa penandatanganan membuat hash dari oktet tanda tangan mentah dengan SHA-256, mengemas digest tersebut sebagai messageImprint RFC 3161, mengirimkan (POST) permintaan ke TSA melalui WinHttp, dan menyematkan token yang dikembalikan sebagai atribut tanda tangan stempel waktu yang tidak ditandatangani (OID 1.2.840.113549.1.9.16.2.14) di dalam SignerInfo unsignedAttrs [1], sesuai EN 319 142-1 §6.3. Stempel waktu tersebut mencakup nilai tanda tangan secara khusus, yang mengikat waktu tepercaya ke tanda tangan yang tepat tersebut
uses
PDFium, FPdfPades;
procedure SignWithTimestamp;
var
Pdf: TPdf;
Options: TPadesSignOptions;
begin
Pdf := TPdf.Create(nil);
try
if not Pdf.PadesCryptoAvailable then
raise Exception.Create('PAdES signing backend is Windows-only');
Pdf.FileName := 'contract.pdf';
Pdf.Active := True;
Options := TPadesSignOptions.Default;
Options.CertificateThumbprint := 'A1B2C3D4E5F6071829304152637485960A1B2C3D';
Options.Level := plB_T;
Options.TsaUrl := 'http://timestamp.example-tsa.com/tsr';
Options.Reason := 'Contract execution';
// Nonce dibiarkan 0: komponen menurunkan nilai anti-replay unik.
Pdf.SignPades('contract-bt.pdf', Options);
finally
Pdf.Free;
end;
end;
CertificateThumbprint adalah hash SHA-1, dalam heksadesimal, dari sertifikat di penyimpanan "MY" Pengguna Saat Ini (Current User) yang kunci privatnya dapat Anda gunakan. Bidang Nonce adalah nilai anti-replay RFC 3161; biarkan nol dan komponen akan menurunkan nilai unik per permintaan dari lipatan SHA-256 dari pencacah (counter), jam, jumlah detak (tick count) dan ID proses, sehingga dua permintaan yang dikeluarkan dalam milidetik yang sama tidak bertabrakan. Teruskan nilai Anda sendiri hanya jika Anda memiliki RNG kriptografis yang lebih Anda percayai. Satu peringatan jujur: B-T membutuhkan TSA yang dapat dijangkau, sehingga penandatanganan sekarang melakukan panggilan jaringan dan mewarisi ketersediaan serta latensi TSA
Menyematkan materi validasi: B-LT dan B-LTA dalam satu panggilan
Langkah naik ke validasi jangka panjang adalah perubahan tunggal: setel Level ke plB_LTA dan pertahankan TsaUrl. PDFium Component kemudian menjalankan seluruh tangga di dalam satu panggilan SignPades. Ia menandatangani B-B, membuat stempel waktu untuk B-T, menyuntikkan Document Security Store untuk B-LT, dan menambahkan stempel waktu arsip untuk B-LTA, masing-masing sebagai pembaruan inkrementalnya sendiri sehingga byte sebelumnya tetap utuh byte-demi-byte
procedure SignForArchive;
var
Pdf: TPdf;
Options: TPadesSignOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'contract.pdf';
Pdf.Active := True;
Options := TPadesSignOptions.Default;
Options.CertificateThumbprint := 'A1B2C3D4E5F6071829304152637485960A1B2C3D';
Options.Level := plB_LTA; // mengarahkan B-B -> B-T -> B-LT -> B-LTA
Options.TsaUrl := 'http://timestamp.example-tsa.com/tsr';
Options.Location := 'Head Office';
// Satu panggilan menulis stempel waktu, DSS, dan DocTimeStamp arsip.
Pdf.SignPades('contract-lta.pdf', Options);
finally
Pdf.Free;
end;
end;
Untuk tahap B-LT, PDFium Component membangun rantai sertifikat dengan CertGetCertificateChain dan menulis kamus /DSS yang membawa sertifikat penandatangan ditambah setiap CA perantara dalam array /Certs (dengan array /OCSPs dan /CRLs paralel), bersama penanda /Extensions /ESIC di Tingkat 1, persis seperti yang ditentukan oleh EN 319 142-1 §5.4.2. Akar yang ditandatangani sendiri (self-signed root) sengaja dihilangkan, karena RFC 5652 §10.2.3 mengizinkannya dan akar tersebut sudah menjadi jangkar kepercayaan yang dipegang oleh validator. Hasilnya adalah tanda tangan yang dapat diverifikasi oleh pembaca hanya dengan berkas tersebut di tangan
Untuk B-LTA, komponen menambahkan Stempel Waktu Dokumen (Document Time-stamp): kamus tanda tangan dengan /SubFilter /ETSI.RFC3161 yang /ByteRange-nya mencakup seluruh berkas, /Contents-nya menahan token RFC 3161 di atas rentang tersebut, dan ia mempromosikan penanda ESIC ke Tingkat 2. Ini adalah langkah pengarsipan §5.4.3 dan TS 119 142-3. Karena DocTimeStamp mencakup DSS serta tanda tangan, ini membuktikan bahwa materi validasi yang disematkan ada dan tidak diubah pada saat pengarsipan, yang merupakan hal yang tepat yang harus dapat ditunjukkan oleh kebijakan retensi jangka panjang
Menambahkan materi pada tanda tangan yang sudah ada
Terkadang tanda tangan sudah ada di dokumen dan Anda hanya perlu menambahkan atau menyegarkan penyimpanan validasi, misalnya untuk meningkatkan tanda tangan B-B pihak ketiga ke B-LT untuk arsip Anda. PDFium Component mengekspos penyuntik DSS secara langsung melalui SaveAsPadesDss, yang menambahkan struktur /DSS dan /Extensions sebagai pembaruan inkremental tanpa menyentuh byte tanda tangan yang ada
procedure AddValidationStore;
var
Pdf: TPdf;
DssOpts: TPadesDssOptions;
Cert: TPadesDssMaterial;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'already-signed.pdf';
Pdf.Active := True;
DssOpts := TPadesDssOptions.Default;
DssOpts.EsicExtensionLevel := 1; // 1 untuk B-LT, 2 untuk B-LTA
Cert.DerBytes := LoadSignerCertDer; // sertifikat berkode DER Anda
SetLength(DssOpts.Certs, 1);
DssOpts.Certs[0] := Cert;
Pdf.SaveAsPadesDss('already-signed-lt.pdf', DssOpts);
finally
Pdf.Free;
end;
end;
Anda menyediakan sertifikat berkode DER, dan secara opsional tanggapan OCSP serta CRL, yang akan dibutuhkan validator. Setel EsicExtensionLevel ke 1 untuk penyimpanan B-LT atau 2 jika DocTimeStamp akan menyusul. Biarkan IncludeVri pada default-nya False: EN 319 142-1 §5.4.2.3 memperlakukan kamus /VRI per tanda tangan sebagai opsional dan menyarankan untuk tidak menggunakannya kecuali jika pembaca spesifik yang Anda targetkan menuntutnya
Biaya dan batasan yang layak direncanakan
Tiga batasan jujur menentukan di mana tingkat-tingkat ini cocok. Pertama, backend kriptografis adalah khusus Windows: penandatanganan dan penandaan stempel waktu melalui platform CNG dan WinHttp penyimpanan, sehingga PadesCryptoAvailable mengembalikan nilai False di platform lain dan SignPades memicu pengecualian. Pemeriksaan sisi baca yang dibahas dalam artikel pendamping tetap lintas platform; hanya penulisan tanda tangan yang terikat pada Windows. Kedua, B-T and B-LTA bergantung pada Otoritas Stempel Waktu (TSA), yang berarti ada perjalanan bolak-balik jaringan pada saat penandatanganan dan layanan eksternal yang waktu aktif (uptime) dan batas kecepatannya (rate limits) menjadi bagian dari jalur penandatanganan Anda
Ketiga, setiap tingkat memakan penyimpanan. Setiap tahap menambahkan pembaruan inkremental alih-alih menulis ulang berkas, DSS menyematkan rantai sertifikat lengkap, dan DocTimeStamp arsip memesan ruang untuk tokennya, sehingga berkas B-LTA secara signifikan lebih besar daripada file B-B asli. Itu adalah pertukaran yang disengaja: Anda menghabiskan byte sekarang untuk membeli verifikasi nanti. Untuk sebagian besar arsip kontrak dan kepatuhan, itu adalah pertukaran yang tepat, tetapi ada baiknya mengukurnya pada dokumen Anda sendiri alih-alih berasumsi. Ketika Anda perlu memastikan berkas yang selesai benar-benar mencapai tingkat yang Anda inginkan, verifikasi dengan teknik dalam memeriksa tanda tangan digital PDF dan tingkat PAdES, dan jika Anda memperkeras alur kerja dokumen secara lebih luas, catatan tentang mengaudit risiko keamanan PDF mencakup pemeriksaan di sekitarnya
Fitur penandatanganan PAdES, DSS, dan stempel waktu arsip yang ditunjukkan di sini adalah bagian dari PDFium Component untuk Delphi dan C++Builder, yang halaman produknya membawa referensi penandatanganan lengkap dan persyaratan platform