THotPDF.SignPDFWithPFX

THotPDF

 

Sebelumnya  Metode  AddPubKeyRecipient

Menandatangani placeholder PDF yang sudah ada menggunakan file PFX / PKCS#12, membangun container CMS SignedData, dan menulis PDF yang sudah ditandatangani dalam satu panggilan

 

Delphi syntax (file overload):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Delphi syntax (stream overload):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Deskripsi

SignPDFWithPFX adalah titik masuk penandatanganan PFX end-to-end yang ditambahkan di v2.119.27. PDF input harus sudah berisi placeholder tanda tangan yang dikeluarkan oleh THPDFPage.AddSignedSignatureField (atau wrapper PAdES-nya) dengan subFilter adbe.pkcs7.detached. Metode ini:

 

1. Memuat PDF input, menemukan placeholder sentinel /ByteRange + /Contents, dan menambal /ByteRange dengan offset byte yang sesungguhnya.

2. Memuat file PFX dan mendekripsinya dengan kata sandi yang diberikan. PBES2 dengan PBKDF2-HMAC-SHA-256 + AES-256-CBC didukung (ini adalah bawaan untuk file PFX yang diekspor oleh OpenSSL 3.0+, certutil Windows 11+, dan macOS Keychain Access). File PBE-SHA1-3DES lawas akan memunculkan diagnostic; ekspor ulang dengan openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Menghitung SHA-256 atas byte dokumen yang tercakup /ByteRange dan membangun blob DER CMS SignedData (RFC 5652) yang berisi sertifikat X.509, atribut yang ditandatangani (contentType + messageDigest + signingTime), dan tanda tangan RSA + SHA-256 atas atribut yang diberi tag SET

4. Men-hex-encode DER CMS, memverifikasi bahwa ukurannya muat dalam budget /Contents yang dicadangkan oleh AddSignedSignatureField (default 8 KB mencakup RSA 1024 / 2048-bit), lalu menyuntikkannya ke placeholder

5. Menulis byte yang sudah ditambal ke jalur atau stream keluaran

 

Mengembalikan True saat berhasil. Melempar EHPDFPFXError pada kata sandi salah, profil enkripsi yang tidak didukung, atau PFX yang rusak; EHPDFCMSError saat PDF input tidak memiliki placeholder yang diharapkan atau DER CMS melampaui budget /Contents yang dicadangkan; EHPDFRSAError saat kunci RSA tidak cocok

 

Alur kerja tipikal

 

Doc := THotPDF.Create(nil);

Doc.FileName := 'unsigned.pdf';

Doc.BeginDoc;

Doc.CurrentPage.AddSignedSignatureField(

  'Sig1', Rect(60, 60, 260, 90), 8192,

  'adbe.pkcs7.detached', 'Approved', 'Brussels', '', []);

Doc.EndDoc;

Doc.Free;

THotPDF.SignPDFWithPFX('unsigned.pdf', 'signed.pdf', 'mykey.pfx', 'mypassword');

 

Catatan

Algoritme tanda tangan adalah RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identifier penandatangan adalah IssuerAndSerialNumber yang diambil dari sertifikat X.509. encapContentInfo bersifat detached (eContent dihilangkan). Atribut yang ditandatangani diurutkan menurut string byte DER menaik per RFC 5652 ยง5.4 sebelum di-hash

 

Untuk alur kerja PAdES B-T / B-LT / B-LTA yang memerlukan timestamp RFC 3161, dictionary DSS, atau tanda tangan timestamp dokumen, helper sisi produsen (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) tetap berlaku; SignPDFWithPFX sendiri mengeluarkan tanda tangan dasar CMS-only (setara PAdES-B-B)

 

See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField