|
THotPDF.SignPDFWithPFX
|
Назад Методы AddPubKeyRecipient |
|
Signs an existing PDF placeholder using a PFX / PKCS#12 file, building a CMS SignedData container and writing the signed PDF in one call.
Delphi syntax (file overload): class function SignPDFWithPFX( const InputPDFPath: string; const OutputPDFPath: string; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Delphi syntax (stream overload): class function SignPDFWithPFX( InputStream: TStream; OutputStream: TStream; const PFXFilePath: string; const Password: AnsiString): boolean; overload; static;
Описание SignPDFWithPFX — это сквозная точка входа для PFX-подписи, добавленная в v2.119.27. Входной PDF уже должен содержать placeholder подписи, созданный THPDFPage.AddSignedSignatureField (или PAdES wrapper) с subFilter adbe.pkcs7.detached. Метод выполняет следующие действия:
1. Загружает входной PDF, находит placeholder /ByteRange + /Contents sentinel и исправляет /ByteRange фактическими byte offsets 2. Загружает PFX file и расшифровывает его переданным password. Поддерживается PBES2 with PBKDF2-HMAC-SHA-256 + AES-256-CBC (это значение по умолчанию для PFX files, экспортированных OpenSSL 3.0+, Windows 11+ certutil и macOS Keychain Access). Старые PBE-SHA1-3DES files вызывают диагностическое сообщение; переэкспортируйте через openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC 3. Вычисляет SHA-256 по байтам документа, покрытым /ByteRange, и строит CMS SignedData (RFC 5652) DER blob, содержащий X.509 certificate, signed attributes (contentType + messageDigest + signingTime) и RSA + SHA-256 signature по SET-tagged signed attributes 4. Кодирует CMS DER в hex, проверяет, что он помещается в бюджет /Contents, зарезервированный AddSignedSignatureField (по умолчанию 8 KB покрывает 1024 / 2048-bit RSA), и вставляет его в placeholder 5. Writes the patched bytes to the output path or stream.
Returns True on success. Raises
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 Алгоритм подписи — RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Идентификатор подписанта — IssuerAndSerialNumber, извлеченный из X.509 certificate. encapContentInfo является detached (eContent omitted). Signed attributes сортируются по возрастанию DER byte string согласно RFC 5652 §5.4 перед хешированием
Для workflow PAdES B-T / B-LT / B-LTA, которым нужны RFC 3161 timestamps, DSS dictionaries или document timestamp signatures, producer-side helpers (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) остаются применимыми; сам SignPDFWithPFX выводит базовую CMS-only signature (эквивалент PAdES-B-B)
См. также: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |