THotPDF.SignPDFWithPFX

THotPDF

 

Précédent  Méthodes  AddPubKeyRecipient

Signe un emplacement PDF existant à l'aide d'un fichier PFX / PKCS#12, construit un conteneur CMS SignedData et écrit le PDF signé en un seul appel

 

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 est le point d'entrée de signature PFX de bout en bout ajouté en v2.119.27. Le PDF d'entrée doit déjà contenir un emplacement de signature émis par THPDFPage.AddSignedSignatureField (ou son wrapper PAdES) avec subFilter adbe.pkcs7.detached. La méthode :

 

1. Charge le PDF d'entrée, localise les emplacements sentinelles /ByteRange + /Sommaire et corrige /ByteRange avec les offsets d'octets réels

2. Charge le fichier PFX et le déchiffre avec le mot de passe fourni. PBES2 avec PBKDF2-HMAC-SHA-256 + AES-256-CBC est pris en charge (c'est le comportement par défaut des fichiers PFX exportés par OpenSSL 3.0+, certutil de Windows 11+ et macOS Keychain Access). Les fichiers hérités PBE-SHA1-3DES déclenchent un diagnostic; réexportez-les avec openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Calcule SHA-256 sur les octets du document couverts par /ByteRange et construit un blob DER CMS SignedData (RFC 5652) contenant le certificat X.509, les attributs signés (contentType + messageDigest + signingTime) et une signature RSA + SHA-256 sur les attributs signés marqués SET

4. Encode le CMS DER en hexadécimal, vérifie qu'il tient dans le budget /Sommaire réservé par AddSignedSignatureField (8 KB par défaut couvrent RSA 1024 / 2048 bits) et l'injecte dans l'emplacement

5. Écrit les octets corrigés dans le chemin ou le flux de sortie

 

Renvoie True en cas de succès. Lève EHPDFPFXError en cas de mot de passe incorrect, de profil de chiffrement non pris en charge ou de PFX mal formé; EHPDFCMSError lorsque le PDF d'entrée ne contient pas l'emplacement attendu ou que le DER CMS dépasse le budget /Sommaire réservé; EHPDFRSAError en cas de non-correspondance de clé RSA

 

Workflow type

 

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

L'algorithme de signature est RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). L'identifiant du signataire est IssuerAndSerialNumber extrait du certificat X.509. encapContentInfo est détaché (eContent omis). Les attributs signés sont triés par ordre croissant des octets DER selon RFC 5652 §5.4 avant le hachage

 

Pour les flux de travail PAdES B-T / B-LT / B-LTA qui ont besoin d'horodatages RFC 3161, de dictionnaires DSS ou de signatures d'horodatage de document, les helpers côté producteur (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) restent applicables; SignPDFWithPFX émet lui-même une signature CMS de base, équivalente à PAdES-B-B

 

Voir aussi: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField