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. Calcula SHA-256 sobre los bytes del documento cubiertos por /ByteRange y construye un bloque DER CMS SignedData (RFC 5652) que contiene el certificado X.509, los atributos firmados (contentType + messageDigest + signingTime) y una firma RSA + SHA-256 sobre los atributos firmados etiquetados con SET

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

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 IssuerAndSerialNumber extraído del certificado X.509. encapContentInfo está desacoplado, con eContent omitido. Los atributos firmados se ordenan por cadena de bytes DER ascendente según RFC 5652 §5.4 antes de calcular el hash

 

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