THotPDF.SignPDFWithPFX

THotPDF

 

Poprzedni  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;

 

Opis

SignPDFWithPFX to kompleksowy punkt wejścia podpisywania PFX dodany w v2.119.27. Wejściowy PDF musi już zawierać signature placeholder utworzony przez THPDFPage.AddSignedSignatureField (lub jego wrapper PAdES) z subFilter adbe.pkcs7.detached. Metoda:

 

1. Wczytuje wejściowy PDF, odnajduje sentinel placeholders /ByteRange + /Contents i uzupełnia /ByteRange rzeczywistymi byte offsets

2. Wczytuje plik PFX i odszyfrowuje go podanym hasłem. Obsługiwany jest PBES2 z PBKDF2-HMAC-SHA-256 + AES-256-CBC (to ustawienie domyślne dla plików PFX eksportowanych przez OpenSSL 3.0+, Windows 11+ certutil i macOS Keychain Access). Legacy PBE-SHA1-3DES files zgłaszają diagnostic; wyeksportuj ponownie poleceniem openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Oblicza SHA-256 dla bytes dokumentu objętych /ByteRange i buduje CMS SignedData (RFC 5652) DER blob zawierający certyfikat X.509, signed attributes (contentType + messageDigest + signingTime) oraz podpis RSA + SHA-256 nad SET-tagged signed attributes

4. Koduje CMS DER jako hex, sprawdza, czy mieści się w budżecie /Contents zarezerwowanym przez AddSignedSignatureField (domyślne 8 KB obejmuje 1024 / 2048-bit RSA), i wstawia go do placeholdera

5. Zapisuje patched bytes do ścieżki wyjściowej lub streamu

 

Zwraca True przy powodzeniu. Zgłasza EHPDFPFXError przy błędnym haśle, nieobsługiwanym encryption profile lub malformed PFX; EHPDFCMSError, gdy wejściowy PDF nie zawiera oczekiwanego placeholdera albo CMS DER przekracza zarezerwowany budżet /Contents; EHPDFRSAError przy RSA key mismatch

 

Typowy przepływ pracy

 

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

 

Uwagi

Algorytm podpisu to RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Signer identifier to IssuerAndSerialNumber wyodrębniony z certyfikatu X.509. encapContentInfo jest detached (eContent pominięte). Signed attributes są sortowane według rosnącego DER byte string zgodnie z RFC 5652 §5.4 przed hashowaniem

 

Dla przepływów PAdES B-T / B-LT / B-LTA wymagających RFC 3161 timestamps, DSS dictionaries lub document timestamp signatures nadal obowiązują producer-side helpers (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); samo SignPDFWithPFX emituje podstawowy podpis wyłącznie CMS (odpowiednik PAdES-B-B)

 

Zobacz też: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField