|
THotPDF.SignPDFWithPFX
|
Trước Phương thức AddPubKeyRecipient |
|
Ký một placeholder PDF hiện có bằng tệp PFX / PKCS#12, tạo container CMS SignedData và ghi PDF đã ký trong một lần gọi
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;
Mô tả SignPDFWithPFX là điểm vào ký PFX trọn vẹn được thêm ở v2.119.27. PDF đầu vào phải đã có sẵn một placeholder chữ ký do THPDFPage.AddSignedSignatureField (hoặc wrapper PAdES của nó) phát ra với subFilter
1. Tải PDF đầu vào, tìm các placeholder sentinel /ByteRange + /Contents và vá /ByteRange bằng các offset byte thực tế 2. Tải tệp PFX và giải mã bằng mật khẩu đã cung cấp. Hỗ trợ PBES2 với PBKDF2-HMAC-SHA-256 + AES-256-CBC (đây là mặc định cho các tệp PFX xuất từ OpenSSL 3.0+, certutil của Windows 11+ và macOS Keychain Access). Các tệp PBE-SHA1-3DES cũ sẽ báo chẩn đoán; hãy xuất lại bằng 3. Tính SHA-256 trên các byte tài liệu nằm trong /ByteRange và tạo một blob DER CMS SignedData (RFC 5652) chứa chứng chỉ X.509, các thuộc tính đã ký (contentType + messageDigest + signingTime) và chữ ký RSA + SHA-256 trên các thuộc tính đã gắn thẻ SET 4. Mã hóa CMS DER sang hex, kiểm tra nó vừa với ngân sách /Contents do AddSignedSignatureField dành ra (mặc định 8 KB đủ cho RSA 1024 / 2048-bit) và chèn nó vào placeholder 5. Ghi các byte đã vá ra đường dẫn hoặc stream đầu ra
Trả về True khi thành công. Ném
Luồng điển hình
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');
Ghi chú Thuật toán ký là RSA + SHA-256 (1.2.840.113549.1.1.1 + 2.16.840.1.101.3.4.2.1). Định danh người ký là IssuerAndSerialNumber lấy từ chứng chỉ X.509. encapContentInfo ở trạng thái detached (bỏ eContent). Các thuộc tính đã ký được sắp xếp theo byte string DER tăng dần theo RFC 5652 §5.4 trước khi băm
Với các luồng PAdES B-T / B-LT / B-LTA cần dấu thời gian RFC 3161, dictionary DSS hoặc chữ ký timestamp của tài liệu, các trợ giúp phía producer (AddPAdESSignatureField, AddPAdESDSSCertificate, AddDocumentTimestampSignature) vẫn áp dụng; riêng SignPDFWithPFX chỉ phát ra một chữ ký CMS cơ bản tương đương PAdES-B-B
See also: AddSignedSignatureField, PreparePDFForSigning, InsertSignatureHex, AddPAdESSignatureField |