|
THotPDF.SignPDFWithPFX
|
Föregående Metoder AddPubKeyRecipient |
|
Signs an existing PDF placeholder using a PFX / PKCS#12 file, building a CMS SignedData container and writing the signed PDF in one call.
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;
Beskrivning
1. Läser in indatans PDF, hittar sentinel-platshållarna /ByteRange + /Contents och patchar /ByteRange med faktiska byte offsets 2. Läser in PFX-filen och dekrypterar den med det angivna lösenordet. PBES2 med PBKDF2-HMAC-SHA-256 + AES-256-CBC stöds (detta är standard för PFX-filer exporterade av OpenSSL 3.0+, Windows 11+ certutil och macOS Keychain Access). Legacy PBE-SHA1-3DES files ger en diagnostic; exportera om med 3. Beräknar SHA-256 över dokumentbytes som täcks av /ByteRange och bygger en CMS SignedData (RFC 5652) DER blob med X.509-certifikatet, signed attributes (contentType + messageDigest + signingTime) och en RSA + SHA-256-signatur över SET-tagged signed attributes 4. Väljer signeringsstemet från den matchade nyckeln, beräknar det nödvändiga dokumentssammandraget och bygger en CMS SignedData (RFC 5652) DER-blob som innehåller undertecknarcertifikatet, dess matchande kedja utan duplicerade DER-certifikat samt signerade attribut. RSA och ECDSA signerar attributsammandraget; Ed25519 och Ed448 signerar hela DER 4. Hex-kodar CMS DER, kontrollerar att den får plats i /Contents-budgeten som AddSignedSignatureField reserverade (standard 8 KB täcker 1024 / 2048-bit RSA) och injicerar den i platshållaren 5. Skriver patched bytes till utdatasökvägen eller streamen
Returnerar True vid framgång. Utlöser
Typiskt arbetsflöde
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');
Anteckningar Signaturalgoritmen är RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Signer identifier är IssuerAndSerialNumber som extraheras från X.509-certifikatet. encapContentInfo är detached (eContent utelämnas). Signed attributes sorteras efter stigande DER byte string enligt RFC 5652 §5.4 innan de hashats För signering från ände till ände, initiera
Noteringar RSA- och ECDSA-PFX-signering använder de inhemska HotPDF- och Windows-kryptografivägarna. Ed25519- och Ed448-PFX-signering kräver OpenSSL 3 Signaturalgoritmen är RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Undertecknaridentifieraren är IssuerAndSerialNumber extraherad ur X.509-certifikatet. encapContentInfo är fristående (eContent utelämnat). Signerade attribut sorteras efter stigande DER-bytesträng enligt RFC 5652 avsnitt 5.4 innan de hashas
För PAdES B-T / B-LT / B-LTA-arbetsflöden som behöver RFC 3161 timestamps, DSS dictionaries eller document timestamp signatures gäller fortfarande producer-side helpers (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX själv skapar en grundläggande CMS-only signature (motsvarande PAdES-B-B)
Se även: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |