THotPDF.SignPDFWithPFX

THotPDF

 

Prejšnja  Metode  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;

 

Description

SignPDFWithPFX je celovita vstopna točka za podpisovanje PFX, dodana v v2.119.27. Vhodni PDF mora že vsebovati označbo podpisa, ki jo ustvari THPDFPage.AddSignedSignatureField (ali njegov ovijalnik PAdES) s subFilter adbe.pkcs7.detached. Metoda:

 

1. Naloži vhodni PDF, poišče označbi /ByteRange + /Contents in ju popravi z dejanskimi bajtnimi odmiki

2. Naloži datoteko PFX in jo dešifrira z danim geslom. Podprt je PBES2 s PBKDF2-HMAC-SHA-256 + AES-256-CBC (to je privzeto za datoteke PFX, izvožene z OpenSSL 3.0+, Windows 11+ certutil in macOS Keychain Access). Zastarele datoteke PBE-SHA1-3DES sprožijo diagnostiko; ponovno jih izvozite z openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Izračuna SHA-256 nad bajti dokumenta, ki jih pokriva /ByteRange, in sestavi DER blob CMS SignedData (RFC 5652), ki vsebuje potrdilo X.509, podpisane atribute (contentType + messageDigest + signingTime) in podpis RSA + SHA-256 nad podpisanimi atributi z oznako SET

4. CMS DER pretvori v šestnajstiško obliko, preveri, ali se prilega proračunu /Contents, ki ga rezervira AddSignedSignatureField (privzetih 8 KB pokrije RSA 1024 / 2048 bitov), in ga vstavi v označbo

5. Zapisane popravljene bajte zapiše v izhodno pot ali tok

 

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

Algoritem podpisa je RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identifikator podpisnika je IssuerAndSerialNumber, pridobljen iz potrdila X.509. encapContentInfo je odklopljen (eContent izpuščen). Podpisani atributi so pred zgoščevanjem razvrščeni naraščajoče po bajtnem nizu DER v skladu z RFC 5652 §5.4

 

Za poteke PAdES B-T / B-LT / B-LTA, ki potrebujejo časovne žige RFC 3161, slovarje DSS ali podpise časovnega žiga dokumenta, še vedno veljajo pripomočki na strani proizvajalca (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); sam SignPDFWithPFX pa izpiše osnovni podpis samo CMS (ustreza PAdES-B-B)

 

See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField