THotPDF.SignPDFWithPFX

THotPDF

 

Anterior  Métodos  AddPubKeyRecipient

Firma un marcador de posición PDF existente usando un archivo PFX / PKCS#12, construye un contenedor CMS SignedData y escribe el PDF firmado en una sola llamada

 

Sintaxis Delphi (sobrecarga de archivo):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Sintaxis Delphi (sobrecarga de flujo):

class function SignPDFWithPFX(

  InputStream: TStream;

  OutputStream: TStream;

  const PFXFilePath: string;

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

 

Descripción

SignPDFWithPFX es el punto de entrada de firma PFX de extremo a extremo agregado en v2.119.27. El PDF de entrada ya debe contener un marcador de posición de firma emitido por THPDFPage.AddSignedSignatureField (o su contenedor PAdES) con subFilter adbe.pkcs7.detached. El método:

 

1. Carga el PDF de entrada, localiza los marcadores de posición centinela /ByteRange + /Contents y actualiza /ByteRange con los desplazamientos de bytes reales

2. Carga el archivo PFX y lo descifra con la contraseña suministrada. Se admite PBES2 con PBKDF2-HMAC-SHA-256 + AES-256-CBC, que es el valor predeterminado de los archivos PFX exportados por OpenSSL 3.0+, certutil de Windows 11+ y Keychain Access de macOS. Los archivos heredados PBE-SHA1-3DES generan un diagnóstico; vuélvelos a exportar con openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

3. Empareja claves privadas RSA, ECDSA de curva con nombre, Ed25519 o Ed448 con certificados por material de clave pública y valores localKeyId exactos de RFC 2985, y después sigue los nombres de emisor / sujeto y las extensiones Authority Key Identifier / Subject Key Identifier para preservar la cadena de intermedios y raíz disponible

4. Selecciona el esquema de firma a partir de la clave emparejada, calcula el resumen del documento requerido y construye un blob DER CMS SignedData (RFC 5652) que contiene el certificado del firmante, su cadena correspondiente sin certificados DER duplicados y los atributos firmados. RSA y ECDSA firman el resumen de atributos; Ed25519 y Ed448 firman el SET OF DER completo de atributos en modo PureEdDSA. Ed25519 usa SHA-512 y Ed448 usa SHAKE256 con salida de 512 bits y id-shake256-len

4. Codifica el DER de CMS en hexadecimal, verifica que quepa en el presupuesto de /Contents reservado por AddSignedSignatureField (el valor predeterminado de 8 KB cubre RSA de 1024 / 2048 bits) y lo inyecta en el marcador de posición

5. Escribe los bytes corregidos en la ruta o el flujo de salida

 

Devuelve True si tiene éxito. Lanza EHPDFPFXError ante una contraseña incorrecta, un perfil de cifrado no compatible o un PFX mal formado; EHPDFCMSError cuando el PDF de entrada no tiene el marcador de posición esperado o el DER de CMS desborda el presupuesto reservado de /Contents; EHPDFRSAError ante una falta de coincidencia de clave RSA

 

Flujo de trabajo típico

 

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

 

Notas

The convenience overload intentionally rejects a PFX that contains more than one matching certificate and private key. Call HPDFEnumeratePFXIdentities to inspect the deterministic identity list and its LocalKeyID and FriendlyName fields, or call HPDFParsePFXByLocalKeyID when only the selected key material is required

For end-to-end signing, initialise THPDFCMSSignOptions with HPDFCMSDefaultSignOptions, copy the selected exact octets into Options.PFXLocalKeyID, and call the HPDFCMSSignPDFStream overload that accepts those options. The selected leaf, available intermediate certificates, and available root are embedded automatically; caller-supplied Options.AdditionalCertsDER values are merged with exact DER deduplication

 

Notas

RSA and ECDSA PFX signing use the native HotPDF and Windows cryptography paths. Ed25519 and Ed448 PFX signing require OpenSSL 3 libcrypto; direct HPDFCMSSignPDFStream callers may set THPDFCMSSignOptions.OpenSSLLibraryPath, while the convenience overload uses the normal platform library search path

El algoritmo de firma es RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). El identificador del firmante es el IssuerAndSerialNumber extraído del certificado X.509. El encapContentInfo es detached (eContent omitido). Los atributos firmados se ordenan por cadena de bytes DER ascendente según la sección 5.4 de RFC 5652 antes de hashearse

 

 

Para flujos de trabajo PAdES B-T / B-LT / B-LTA que necesitan marcas de tiempo RFC 3161, diccionarios DSS o firmas de marca de tiempo de documento, siguen aplicando los ayudantes del lado del productor (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX por sí mismo emite una firma básica solo CMS, equivalente a PAdES-B-B

 

Ver también: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField