THotPDF.SignPDFWithPFX

THotPDF

 

Anterior  Metode  AddPubKeyRecipient

Semnează un marcaj PDF existent folosind un fișier PFX / PKCS#12, construiește un container CMS SignedData și scrie PDF-ul semnat într-un singur apel

 

Delphi syntax (file overload):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Sintaxă Delphi (supraincărcare stream):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

  const Password: AnsiString): boolean; overload; static;

 

Descriere

SignPDFWithPFX este punctul de intrare complet pentru semnarea PFX adăugat în v2.119.27. PDF-ul de intrare trebuie să conțină deja un marcaj de semnătură emis de THPDFPage.AddSignedSignatureField (sau de wrapperul său PAdES) cu subFilter adbe.pkcs7.detached. Metoda:

 

1. Încarcă PDF-ul de intrare, localizează marcajele sentinel pentru /ByteRange + /Contents și actualizează /ByteRange cu deplasările reale de octeți

2. Încarcă fișierul PFX și îl decriptează cu parola furnizată. Este acceptat PBES2 cu PBKDF2-HMAC-SHA-256 + AES-256-CBC (aceasta este valoarea implicită pentru fișierele PFX exportate de OpenSSL 3.0+, certutil din Windows 11+ și macOS Keychain Access). Fișierele vechi PBE-SHA1-3DES generează un diagnostic; reexportați cu openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Calculează SHA-256 peste octeții documentului acoperiți de /ByteRange și construiește un blob DER CMS SignedData (RFC 5652) care conține certificatul X.509, atributele semnate (contentType + messageDigest + signingTime) și o semnătură RSA + SHA-256 peste atributele semnate cu etichetă SET

4. Codifică CMS DER în hex, verifică dacă încape în bugetul /Contents rezervat de AddSignedSignatureField (implicit 8 KB acoperă RSA de 1024 / 2048 biți) și îl injectează în marcaj

5. Scrie octeții corectați în calea de ieșire sau în stream

 

Returnează True la succes. Aruncă EHPDFPFXError pentru o parolă greșită, un profil de criptare neacceptat sau un PFX format greșit; EHPDFCMSError când PDF-ul de intrare nu are marcajul așteptat sau CMS DER depășește bugetul /Contents rezervat; EHPDFRSAError la neconcordanță de cheie RSA

 

Flux tipic

 

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

 

Note

Algoritmul de semnătură este RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Identificatorul semnatarului este IssuerAndSerialNumber extras din certificatul X.509. encapContentInfo este detached (eContent omis). Atributele semnate sunt ordonate după șirul de octeți DER în ordine ascendentă, conform RFC 5652 §5.4, înainte de a fi hash-uite

 

Pentru fluxurile PAdES B-T / B-LT / B-LTA care au nevoie de marcaje temporale RFC 3161, dicționare DSS sau semnături de tip document timestamp, se aplică în continuare ajutoarele din partea producătorului (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX emite singur doar o semnătură CMS de bază, echivalentă cu PAdES-B-B

 

Vezi și: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField