THotPDF.SignPDFWithPFX

THotPDF

 

Vorige  Methodn  AddPubKeyRecipient

Ondertekent een bestaande PDF-placeholder met een PFX / PKCS#12-bestand, bouwt een CMS SignedData-container op en schrijft de ondertekende PDF in één aanroep weg

 

Delphi-syntaxis (bestands-overload):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Delphi-syntaxis (stream-overload):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

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

 

Beschrijving

SignPDFWithPFX is het end-to-end PFX-ondertekeningsingangspunt dat is toegevoegd in v2.119.27. De invoer-PDF moet al een handtekening-placeholder bevatten die is uitgegeven door THPDFPage.AddSignedSignatureField (of de PAdES-wrapper daarvan) met subFilter adbe.pkcs7.detached. De methode:

 

1. Laadt de invoer-PDF, zoekt de /ByteRange + /Inhoud-sentinelplaceholders op en patcht /ByteRange met de werkelijke byte-offsets

2. Laadt het PFX-bestand en ontcijfert het met het opgegeven wachtwoord. PBES2 met PBKDF2-HMAC-SHA-256 + AES-256-CBC wordt ondersteund (dit is de standaard voor PFX-bestanden die zijn geëxporteerd door OpenSSL 3.0+, Windows 11+ certutil en macOS Keychain Access). Oude PBE-SHA1-3DES-bestanden geven een diagnose; exporteer opnieuw met openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Berekent SHA-256 over de documentbytes binnen /ByteRange en bouwt een CMS SignedData (RFC 5652) DER-blob met het X.509-certificaat, de ondertekende attributen (contentType + messageDigest + signingTime) en een RSA + SHA-256-handtekening over de SET-gemarkeerde ondertekende attributen

4. Hex-encodeert de CMS DER, controleert dat deze past binnen het door AddSignedSignatureField gereserveerde /Inhoud-budget (standaard dekt 8 KB 1024 / 2048-bit RSA) en injecteert het in de placeholder

5. Schrijft de gepatchte bytes weg naar het uitvoerpad of de uitvoerstream

 

Geeft True terug bij succes. Gooit EHPDFPFXError bij een verkeerd wachtwoord, niet-ondersteund encryptieprofiel of foutieve PFX; EHPDFCMSError wanneer de invoer-PDF de verwachte placeholder mist of de CMS DER over het gereserveerde /Inhoud-budget heen loopt; EHPDFRSAError bij een RSA-sleutel mismatch

 

Typische workflow

 

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');

 

Opmerkingen

Het handtekeningalgoritme is RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). De signer identifier is IssuerAndSerialNumber die uit het X.509-certificaat wordt gehaald. De encapContentInfo is detached (eContent weggelaten). Ondertekende attributen worden gesorteerd op oplopende DER-bytevolgorde volgens RFC 5652 §5.4 vóór ze worden gehasht

 

Voor PAdES B-T / B-LT / B-LTA-workflows die RFC 3161-tijdstempels, DSS-dictionaries of document-tijdstempelhandtekeningen nodig hebben, blijven de producer-side hulpfuncties (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) van toepassing; SignPDFWithPFX zelf geeft alleen een basis-CMS-handtekening uit (equivalent aan PAdES-B-B)

 

Zie ook: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField