|
THotPDF.SignPDFWithPFX – metoda
|
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
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í 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á
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 |