|
THotPDF.SignPDFWithPFX
|
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
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 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
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 |