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. Associe des clés privées RSA, ECDSA à courbe nommée, Ed25519 ou Ed448 à des certificats par matériel de clé publique et valeurs localKeyId RFC 2985 exactes, puis suit les noms d’émetteur / sujet et les extensions Authority Key Identifier / Subject Key Identifier pour préserver la chaîne intermédiaire et racine disponible

4. Sélectionne le schéma de signature selon la clé appariée, calcule le condensé de document requis, et construit un blob DER CMS SignedData (RFC 5652) contenant le certificat du signataire, sa chaîne correspondante sans certificats DER dupliqués et les attributs signés. RSA et ECDSA signent le condensé des attributs ; Ed25519 et Ed448 signent le SET OF DER complet des attributs en mode PureEdDSA. Ed25519 utilise SHA-512 et Ed448 utilise SHAKE256 avec une sortie de 512 bits et id-shake256-len

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

La surcharge de commodité rejette délibérément un PFX contenant plus d’un certificat et d’une clé privée correspondants. Appelez HPDFEnumeratePFXIdentities pour inspecter la liste déterministe des identités et ses champs LocalKeyID et FriendlyName, ou appelez HPDFParsePFXByLocalKeyID lorsque seul le matériel de clé sélectionné est requis

Pour une signature de bout en bout, initialisez THPDFCMSSignOptions avec HPDFCMSDefaultSignOptions, copiez les octets exacts sélectionnés dans Options.PFXLocalKeyID, et appelez la surcharge de HPDFCMSSignPDFStream qui accepte ces options. La feuille sélectionnée, les certificats intermédiaires disponibles et la racine disponible sont embarqués automatiquement ; les valeurs Options.AdditionalCertsDER fournies par l’appelant sont fusionnées avec une déduplication DER exacte

 

Remarques

La signature PFX RSA et ECDSA emprunte les chemins natifs HotPDF et de cryptographie Windows. La signature PFX Ed25519 et Ed448 exige OpenSSL 3 libcrypto ; les appelants directs de HPDFCMSSignPDFStream peuvent définir THPDFCMSSignOptions.OpenSSLLibraryPath, tandis que la surcharge de commodité utilise le chemin de recherche de bibliothèques normal de la plateforme

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. L’encapContentInfo est détaché (eContent omis). Les attributs signés sont triés par chaîne d’octets DER croissante selon la section 5.4 de la RFC 5652 avant hachage

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