THotPDF.SignPDFWithPFX – metoda

THotPDF

 

Předchozí  Metody  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;

 

Popis

SignPDFWithPFX je koncový vstupní bod pro podepisování pomocí PFX přidaný ve v2.119.27. Vstupní PDF už musí obsahovat zástupný prostor podpisu vytvořený THPDFPage.AddSignedSignatureField (nebo jeho obalem PAdES) se subFilter adbe.pkcs7.detached. Metoda:

 

1. Načte vstupní PDF, najde zástupné sentinelové položky /ByteRange + /Contents a opraví /ByteRange skutečnými bajtovými offsety

2. Načte soubor PFX a dešifruje jej dodaným heslem. PBES2 s PBKDF2-HMAC-SHA-256 + AES-256-CBC je podporováno (to je výchozí pro soubory PFX exportované pomocí OpenSSL 3.0+, Windows 11+ certutil a macOS Keychain Access). Starší soubory PBE-SHA1-3DES vyvolají diagnostiku; exportujte je znovu pomocí openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Vypočítá SHA-256 nad bajty dokumentu pokrytými /ByteRange a sestaví DER blob CMS SignedData (RFC 5652) obsahující certifikát X.509, podepsané atributy (contentType + messageDigest + signingTime) a podpis RSA + SHA-256 nad podepsanými atributy označenými SET

4. Hexadecimálně zakóduje CMS DER, ověří, že se vejde do rozpočtu /Contents rezervovaného AddSignedSignatureField (výchozích 8 KB pokrývá 1024 / 2048bitové RSA), a vloží jej do zástupného prostoru

5. Zapíše opravené bajty do výstupní cesty nebo streamu

 

Při úspěchu vrací True. Vyvolá EHPDFPFXError při špatném hesle, nepodporovaném šifrovacím profilu nebo poškozeném PFX; EHPDFCMSError, když vstupní PDF nemá očekávaný zástupný prostor nebo CMS DER překročí rezervovaný rozpočet /Contents; EHPDFRSAError při neshodě klíče RSA

 

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

 

Poznámky

Algoritmus podpisu je RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identifikátor podepisujícího je IssuerAndSerialNumber extrahovaný z certifikátu X.509. encapContentInfo je oddělený (eContent vynecháno). Podepsané atributy jsou před hashováním seřazeny vzestupně podle bajtového řetězce DER podle RFC 5652 §5.4

 

Pro workflow PAdES B-T / B-LT / B-LTA, která potřebují časová razítka RFC 3161, slovníky DSS nebo podpisy časového razítka dokumentu, se stále používají pomocné metody na straně producenta (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); samotné SignPDFWithPFX vydává základní podpis pouze CMS (ekvivalent PAdES-B-B)

 

Viz také: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField