THotPDF.SignPDFWithPFX

THotPDF

 

Predchádzajúce  Metódy  AddPubKeyRecipient

Podpíše existujúci PDF placeholder pomocou súboru PFX / PKCS#12, zostaví kontajner CMS SignedData a zapíše podpísané PDF v jednom volaní

 

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;

 

Opis

SignPDFWithPFX je koncový vstupný bod pre podpisovanie PFX pridaný vo v2.119.27. Vstupné PDF už musí obsahovať zástupný podpisový placeholder emitovaný THPDFPage.AddSignedSignatureField alebo jeho PAdES wrapperom s subFilter adbe.pkcs7.detached. Metóda:

 

1. Načíta vstupné PDF, nájde sentinel placeholdery /ByteRange + /Contents a opraví /ByteRange na skutočné bajtové offsety

2. Načíta súbor PFX a dešifruje ho zadaným heslom. Podporované je PBES2 s PBKDF2-HMAC-SHA-256 + AES-256-CBC, čo je predvolený formát pre súbory PFX exportované z OpenSSL 3.0+, Windows 11+ certutil a macOS Keychain Access. Staršie súbory PBE-SHA1-3DES vyvolajú diagnostiku; export zopakujte pomocou openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Vypočíta SHA-256 nad bajtmi dokumentu pokrytými /ByteRange a zostaví DER blob CMS SignedData (RFC 5652) obsahujúci certifikát X.509, podpísané atribúty (contentType + messageDigest + signingTime) a podpis RSA + SHA-256 nad podpísanými atribútmi označenými SET

4. Prevedie CMS DER do hexu, overí, že sa zmestí do rozpočtu /Contents rezervovaného AddSignedSignatureField (predvolene 8 KB pokrýva 1024 / 2048-bit RSA), a vloží ho do placeholdera

5. Zapíše opravené bajty do výstupnej cesty alebo streamu

 

Vracia True pri úspechu. Vyvolá EHPDFPFXError pri zlom hesle, nepodporovanom šifrovacom profile alebo poškodenom PFX; EHPDFCMSError, keď vstupné PDF nemá očakávaný placeholder alebo CMS DER prekročí rezervovaný rozpočet /Contents; EHPDFRSAError pri nesúlade RSA kľúča

 

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

Algoritmus podpisu je RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identifikátor podpisovateľa je IssuerAndSerialNumber prevzatý z certifikátu X.509. encapContentInfo je oddelený (eContent vynechaný). Podpísané atribúty sa pred hashovaním triedia vzostupne podľa bajtového reťazca DER v súlade s RFC 5652 §5.4

 

Pre workflowy PAdES B-T / B-LT / B-LTA, ktoré potrebujú časové pečiatky RFC 3161, slovníky DSS alebo podpisy dokumentových časových pečiatok, sa stále používajú pomocné funkcie na strane producenta (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); samotný SignPDFWithPFX vytvára iba základný CMS podpis (ekvivalent PAdES-B-B)

 

See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField