THotPDF.SignPDFWithPFX

THotPDF

 

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 adbe.pkcs7.detached. Phương thức này:

 

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 openssl pkcs12 -export ... -keypbe AES-256-CBC -certpbe AES-256-CBC

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 EHPDFPFXError khi mật khẩu sai, cấu hình mã hóa không được hỗ trợ hoặc PFX lỗi; ném EHPDFCMSError khi PDF đầu vào thiếu placeholder mong đợi hoặc CMS DER vượt quá ngân sách /Contents đã dành; ném EHPDFRSAError khi khóa RSA không khớp

 

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