|
THotPDF.SignPDFWithPFX
|
Previous Methods AddPubKeyRecipient |
|
Firma un marcador PDF existente usando un archivo PFX / PKCS#12, selecciona determinísticamente una identidad de credencial, construye un contenedor CMS SignedData con su cadena de certificados disponible y escribe el PDF firmado en una 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 stream): 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 añadido en v2.119.27. El PDF de entrada ya debe contener un placeholder de firma emitido por THPDFPage.AddSignedSignatureField (o su wrapper PAdES) con subFilter
1. Copia la entrada a través de un búfer acotado de 256 KB, o reutiliza el mismo stream legible/escribible desplazable, localiza los placeholders /ByteRange + /Contents y parchea por seek el campo /ByteRange de anchura fija con los offsets de byte reales 2. Carga el archivo PFX y lo descifra con la contraseña suministrada. PBES2 acepta AES-128-CBC, AES-192-CBC y AES-256-CBC con el HMAC-SHA-1 por defecto o HMAC-SHA-256, HMAC-SHA-384 y HMAC-SHA-512 explícitos como PRF de PBKDF2. Un 3. Empareja claves privadas RSA, ECDSA de curva nombrada, Ed25519 o Ed448 con certificados por material de clave pública y valores 4. Selecciona el esquema de firma a partir de la clave coincidente, calcula el digest 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 digest de los atributos; Ed25519 y Ed448 firman el 5. Codifica en hexadecimal el DER del CMS, verifica que cabe en el presupuesto de /Contents reservado por AddSignedSignatureField (los 8 KB por defecto cubren RSA de 1024 / 2048 bits) y lo inyecta en el placeholder 6. Escribe los bytes parcheados en la ruta o stream de salida
Devuelve True en caso de é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');
Archivos PFX multi-identidad La sobrecarga de conveniencia rechaza deliberadamente un PFX que contiene más de un certificado y clave privada coincidentes. Llame a Para firma de extremo a extremo, inicialice
Notas La firma PFX RSA y ECDSA usa las rutas nativas de criptografía de HotPDF y Windows. La firma PFX Ed25519 y Ed448 exige OpenSSL 3 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. El encapContentInfo es destacado (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 los flujos PAdES B-T / B-LT / B-LTA que necesitan sellos de tiempo RFC 3161, diccionarios DSS o firmas de sello de tiempo del documento, siguen siendo aplicables los helpers del lado productor (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature); SignPDFWithPFX por sí mismo emite una firma básica solo CMS (equivalente a PAdES-B-B) La sobrecarga a stream nunca retiene un segundo PDF completo en memoria. Hashea la salida parcheada en rangos acotados y parchea por seek el valor CMS hexadecimal sin cambiar la longitud del archivo. Los offsets decimales de ancho fijo soportan PDFs preparados menores de 10.000.000.000 bytes
Véase también: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |