THotPDF.SignPDFWithPFX

THotPDF

 

Zurück  Methoden  AddPubKeyRecipient

Signiert einen vorhandenen PDF-Platzhalter unter Verwendung einer PFX- / PKCS#12-Datei, erstellt einen CMS-SignedData-Container und schreibt das signierte PDF in einem einzigen Aufruf

 

Delphi-Syntax (Datei-Überladung):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Delphi-Syntax (Stream-Überladung):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

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

 

Beschreibung

SignPDFWithPFX ist der in v2.119.27 hinzugefügte End-to-End-PFX-Signatur-Einstiegspunkt; das Eingabe-PDF muss bereits einen Signaturplatzhalter enthalten, der von THPDFPage.AddSignedSignatureField (oder dessen PAdES-Wrapper) mit dem SubFilter adbe.pkcs7.detached ausgegeben wurde; die Methode:

 

1. Lädt das Eingabe-PDF, lokalisiert die Platzhalter-Sentinels für /ByteRange + /Contents und aktualisiert /ByteRange mit den tatsächlichen Byte-Offsets

2. Lädt die PFX-Datei und entschlüsselt sie mit dem angegebenen Passwort; PBES2 mit PBKDF2-HMAC-SHA-256 + AES-256-CBC wird unterstützt (dies ist der Standard für PFX-Dateien, die von OpenSSL 3.0+, Windows 11+ certutil und macOS Schlüsselbundverwaltung exportiert wurden); veraltete PBE-SHA1-3DES-Dateien lösen einen Diagnosefehler aus; exportieren Sie diese erneut mit openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Berechnet SHA-256 über die vom /ByteRange abgedeckten Dokument-Bytes und erstellt ein CMS SignedData (RFC 5652) DER-Blob, das das X.509-Zertifikat, die signierten Attribute (contentType + messageDigest + signingTime) und eine RSA + SHA-256-Signatur über die SET-markierten signierten Attribute enthält

4. Hex-kodiert das CMS-DER, überprüft, ob es in das von AddSignedSignatureField reservierte /Contents-Budget passt (Standard 8 KB deckt 1024 / 2048-Bit RSA ab), und fügt es in den Platzhalter ein

5. Schreibt die gepatchten Bytes in den Ausgabepfad oder -stream

 

Gibt bei Erfolg True zurück; löst bei falschem Passwort, nicht unterstütztem Verschlüsselungsprofil oder fehlerhaftem PFX eine EHPDFPFXError-Ausnahme aus; löst eine EHPDFCMSError-Ausnahme aus, wenn das Eingabe-PDF nicht den erwarteten Platzhalter enthält oder das CMS-DER das reservierte /Contents-Budget überschreitet; löst bei einer RSA-Schlüsseldiskrepanz eine EHPDFRSAError-Ausnahme aus

 

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

 

Hinweise

Der Signatur-Algorithmus ist RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1); der Signaturgeber-Identifikator ist die aus dem X.509-Zertifikat extrahierte IssuerAndSerialNumber; die encapContentInfo ist abgetrennt (eContent ausgelassen); signierte Attribute werden vor dem Hashing gemäß RFC 5652 §5.4 nach aufsteigender DER-Byte-Reihenfolge sortiert

 

Für PAdES B-T / B-LT / B-LTA-Workflows, die RFC 3161-Zeitstempel, DSS-Wörterbücher oder Dokumentzeitstempel-Signaturen erfordern, gelten weiterhin die Ersteller-Hilfsfunktionen (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX selbst erzeugt eine einfache reine CMS-Signatur (äquivalent zu PAdES-B-B)

 

Siehe auch: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField