THotPDF.SignPDFWithPFX

THotPDF

 

Forrige  Metoder  AddPubKeyRecipient

Underskriver en eksisterende PDF-pladsholder ved hjælp af en PFX / PKCS#12-fil, opbygger en CMS SignedData-container og skriver den underskrevne PDF i ét kald

 

Delphi-syntaks (filoverbelastning):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Delphi-syntaks (streamoverbelastning):

class function SignPDFWithPFX(

InputStream: TStream;

OutputStream: TStream;

  const PFXFilePath: string;

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

 

Beskrivelse

SignPDFWithPFX er det komplette indgangspunkt til PFX-underskrivning tilføjet i v2.119.27. Input-PDF'en skal allerede indeholde en signaturpladsholder oprettet af THPDFPage.AddSignedSignatureField (eller dens PAdES-wrapper) med subFilteradbe.pkcs7.detached. Metoden:

 

1. Indlæser input-PDF'en, lokaliserer pladsholderne for /ByteRange + /Contents-sentinel, og retter /ByteRange med de faktiske byte-forskydninger

2. Indlæser PFX-filen og dekrypterer den med den angivne adgangskode. PBES2 med PBKDF2-HMAC-SHA-256 + AES-256-CBC understøttes (dette er standarden for PFX-filer eksporteret af OpenSSL 3.0+, Windows 11+ certutil og macOS Keychain Access). Ældre PBE-SHA1-3DES-filer udløser en diagnostik; eksporter igen medopenssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC.

3. Beregner SHA-256 over de /ByteRange-dækkede dokument-bytes og opbygger en CMS SignedData (RFC 5652) DER-blob, der indeholder X.509-certifikatet, de signerede attributter (contentType + messageDigest + signingTime) og en RSA + SHA-256-signatur over de SET-taggede signerede attributter

4. Hex-koder CMS DER, verificerer, at det passer til /Contents-budgettet reserveret af AddSignedSignatureField (standard 8 KB dækker 1024 / 2048-bit RSA), og indsætter det i pladsholderen

5. Skriver de rettede bytes til outputstien eller -streamen

 

Returnerer True ved succes. UdløserEHPDFPFXErrorved en forkert adgangskode, ikke-understøttet krypteringsprofil eller misdannet PFX;EHPDFCMSErrornår input-PDF'en mangler den forventede pladsholder, eller CMS DER løber over det reserverede /Contents-budget;EHPDFRSAErrorved RSA-nøglemismatch

 

Typisk arbejdsgang

 

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

Signaturanalgoritmen er RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Signaturoplukkeren er IssuerAndSerialNumber udtrukket fra X.509-certifikatet. EncapContentInfo er fritliggende (eContent udeladt). Signerede attributter sorteres efter stigende DER-bytestreng i henhold til RFC 5652 §5.4 før de hashes

 

Til PAdES B-T / B-LT / B-LTA-arbejdsgange, der kræver RFC 3161-tidsstempler, DSS-ordbøger eller dokumentsignaturtidsstempler, gælder producent-side-hjælperne (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) stadig; SignPDFWithPFX selv udsender en grundlæggende kun-CMS-signatur (svarende til PAdES-B-B)

 

Se også: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField