THotPDF.SignPDFWithPFX

THotPDF

 

Ankstesnis  Metodai  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;

 

Aprašas

SignPDFWithPFX yra visą PFX pasirašymo eigą apimantis įėjimo taškas, pridėtas v2.119.27. Įvesties PDF jau turi turėti signature placeholder, išvestą THPDFPage.AddSignedSignatureField (arba jo PAdES apgaubtuve) su subFilter adbe.pkcs7.detached. Metodas:

 

1. Įkelia įvesties PDF, suranda /ByteRange + /Contents žymeklių vietos rezervavimo ženklus ir pataiso /ByteRange pagal tikruosius baitų poslinkius

2. Įkelia PFX failą ir jį iššifruoja su pateiktu slaptažodžiu. Palaikomas PBES2 su PBKDF2-HMAC-SHA-256 + AES-256-CBC (tai numatyta OpenSSL 3.0+, Windows 11+ certutil ir macOS Keychain Access eksportuojamiems PFX failams). Senieji PBE-SHA1-3DES failai sukelia diagnostinį pranešimą; eksportuokite iš naujo naudodami openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Apskaičiuoja SHA-256 per /ByteRange apimtus dokumento baitus ir sukuria CMS SignedData (RFC 5652) DER duomenų bloką, kuriame yra X.509 sertifikatas, pasirašyti atributai (contentType + messageDigest + signingTime) ir RSA + SHA-256 parašas virš SET žyme pažymėtų pasirašytų atributų

4. CMS DER užkoduojamas šešioliktainiu formatu, patikrinama, ar jis telpa į AddSignedSignatureField rezervuotą /Contents biudžetą (numatyta 8 KB tinka 1024 / 2048 bitų RSA), ir įterpiamas į vietos rezervavimo ženklą

5. Įrašo pataisytus baitus į išvesties kelią arba srautą

 

Returns True on success. Raises EHPDFPFXError on a bad password, unsupported encryption profile, or malformed PFX; EHPDFCMSError when the input PDF lacks the expected placeholder or the CMS DER overflows the reserved /Contents budget; EHPDFRSAError on RSA key mismatch.

 

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

 

Notes

Parašo algoritmas yra RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Pasirašančiojo identifikatorius yra IssuerAndSerialNumber, ištrauktas iš X.509 sertifikato. encapContentInfo yra atskirtas (eContent praleidžiamas). Pasirašyti atributai prieš maišant surikiuojami didėjančia DER baitų eilute pagal RFC 5652 §5.4

 

PAdES B-T / B-LT / B-LTA srautams, kuriems reikia RFC 3161 laiko žymų, DSS žodynų arba dokumento laiko žymos parašų, gamintojo pusės pagalbinės funkcijos (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) vis dar taikomos; pati SignPDFWithPFX išveda tik bazinį CMS parašą (PAdES-B-B atitikmuo)

 

See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField