|
THotPDF.SignPDFWithPFX
|
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
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 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
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 |