THotPDF.SignPDFWithPFX

THotPDF

 

Anterior  Métodos  AddPubKeyRecipient

Assina um espaço reservado PDF existente usando um arquivo PFX / PKCS#12, construindo um contêiner SignedData CMS e escrevendo o PDF assinado em uma única chamada.

 

Sintaxe Delphi (sobrecarga de arquivo):

class function SignPDFWithPFX(

  const InputPDFPath: string;

  const OutputPDFPath: string;

  const PFXFilePath: string;

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

 

Sintaxe Delphi (sobrecarga de stream):

class function SignPDFWithPFX(

  InputStream: TStream;

  OOOutputStream: TStream;

  const PFXFilePath: string;

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

 

Descrição

SignPDFWithPFX é o ponto de entrada completo de assinatura PFX adicionado na v2.119.27. O PDF de entrada já deve conter um placeholder de assinatura emitido por THPDFPage.AddSignedSignatureField (ou seu wrapper PAdES) com subFilter adbe.pkcs7.detached. O método:

 

1. Carrega o PDF de entrada, localiza os espaços reservados sentinelas /ByteRange + /Conteúdo e corrige o /ByteRange com os deslocamentos de bytes reais.

2. Carrega o arquivo PFX e o descriptografa com a senha fornecida. PBES2 com PBKDF2-HMAC-SHA-256 + AES-256-CBC é suportado (este é o padrão para arquivos PFX exportados pelo OpenSSL 3.0+, Windows 11+ certutil e Acesso às Chaves do macOS). Arquivos herdados PBE-SHA1-3DES geram um diagnóstico; reexporte com openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC.

3. Calcula o SHA-256 sobre os bytes do documento cobertos pelo /ByteRange e cria um blob DER CMS SignedData (RFC 5652) contendo o certificado X.509, os atributos assinados (contentType + messageDigest + signingTime) e uma assinatura RSA + SHA-256 sobre os atributos assinados com tag SET.

4. Codifica o CMS DER em hexadecimal, verifica se ele cabe no orçamento de /Contents reservado por AddSignedSignatureField (o padrão de 8 KB cobre RSA de 1024 / 2048 bits) e o injeta no placeholder

5. Writes the patched bytes para the output path or stream.

 

Retorna True se for bem-sucedido. Levanta EHPDFPFXError on a bad password, unsupported encryption profile, or malformed PFX; EHPDFCMSError when the input PDF lacks the expected placeholder or the CMS DER overflows the reserved /Conteúdo budget; EHPDFRSAError on RSA key mismatch.

 

Typical workflow

 

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

O algoritmo de assinatura é RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). O identificador de signatário é o IssuerAndSerialNumber extraído do certificado X.509. O encapContentInfo é separado (eContent omitido). Os atributos assinados são ordenados de forma crescente pela string de bytes DER por RFC 5652 §5.4 antes de serem submetidos ao hash.

 

Para os fluxos de trabalho PAdES B-T / B-LT / B-LTA que precisam de timestamps RFC 3161, dicionários DSS ou assinaturas de timestamps de documentos, os auxiliares do lado do produtor (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) still apply; SignPDFWithPFX itself emits a basic CMS-only signature (PAdES-B-B equivalent).

 

Veja também: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField